Я использую ssh-исполнитель gitlab runner для доступа к встроенному устройству через ssh. Я хочу запустить там скрипт.
Обычно сценарий вызывает процедуру обновления на устройстве с помощью dbus. Достаточно просто, не правда ли?
#!/bin/bash
dbus-send --session --print-reply --dest=blabla /path blabla.swupdate.InitiateUpdate string:"" string:"" string:"$1"
sleep 4
dbus-send --session --print-reply --dest=--dest=blabla /path blabla.UpgradeMode
Теперь устройство немедленно перезагрузится, в результате чего соединение ssh с gitlab runner неожиданно прервется, что приведет к сбою конвейера.
Я придумал, какие различные записи сценария отсоединяют последний вызов dbus от ssh-соединения, но безрезультатно.
Вот что я пробовал:
#!/bin/bash
dbus-send --session --print-reply --dest=blabla /path blabla.swupdate.InitiateUpdate string:"" string:"" string:"$1"
nohup $(sleep 2 && dbus-send --session --print-reply --dest=--dest=blabla /path blabla.UpgradeMode)&
echo "ready to disconnect ssh"
Когда я подключаюсь вручную с помощью ssh, выполняю сценарий и быстро отключаюсь вручную с помощью exit
, Вижу перезагрузку системы. Но когда gitlab-runner
все выполняет, задание выполняется успешно, но перезагрузки не происходит. Так что я уверен, что nohup
-команда не выполняется полностью.
Я пробовал поставить nohup
перед обоими sleep
и dbus-send
команда, а также пытаюсь поставить disown
после круглых скобок. Я также попытался, как это было предложено в комментарии здесь, поставить nohup перед вызовом скрипта в .gitlab-ci.yml
.
Ничего из этого не привело к успеху.
Есть идеи, как это сделать?
Спасибо
Мне жаль, что это так поздно. У меня недавно была такая же проблема. Gitlab runner блокирует дочерние процессы и любой процесс в дочернем дереве. Это делает disown
команда не работает. Разветвление и nohup
тоже не работают.
Единственное решение, которое я мог придумать, - использовать at
команда https://linux.die.net/man/1/at
В основном я помещал свою команду в сценарий, а затем делал:
at new < my_script.sh
. Это успешно завершилось и запустило мою программу в фоновом режиме.