Как правильно использовать nohup в ssh-сессии, вызываемой gitlab-runner?
Я использую ssh executor 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
,
Ничто из этого не приводит к успеху.
Есть идеи, как сделать это правильно?
Спасибо
0 ответов
Мне жаль, что это так поздно. У меня недавно была такая же проблема. Gitlab runner блокирует дочерние процессы и любой процесс в дочернем дереве. Это делает
disown
команда не работает. Разветвление и
nohup
тоже не работают.
Единственное решение, которое я мог придумать, - использовать
at
команда https://linux.die.net/man/1/at
В основном я помещал свою команду в сценарий, а затем делал:
at new < my_script.sh
. Это успешно завершилось и запустило мою программу в фоновом режиме.