Назад | Перейти на главную страницу

Как правильно использовать nohup в сеансе ssh, вызванном gitlab-runner?

Я использую 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. Это успешно завершилось и запустило мою программу в фоновом режиме.