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

Другие вопросы по тегам