如何在 gitlab-runner 调用的 ssh 会话中正确使用 nohup?

如何在 gitlab-runner 调用的 ssh 会话中正确使用 nohup?

我使用 gitlab runner 的 ssh 执行器通过 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

现在设备将立即重新启动,导致与 gitlab runner 的 ssh 连接意外终止,从而导致管道失败。

我想出了使用各种脚本条目来从 ssh 连接中分离最后的 dbus 调用,但无济于事。

这是我尝试过的一件事:

#!/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执行所有操作时,作业成功,但没有重新启动。所以我确信 -commandnohup没有完全执行。

我尝试将其放在和命令nohup前面,也尝试将其放在括号后面。我还尝试按照此处评论的建议,将 nohup 放在脚本调用前面。sleepdbus-senddisown.gitlab-ci.yml

这些都不会带来成功。

有什么想法吗,如何实现这一点?

谢谢

答案1

很抱歉这么晚才回复。我最近也遇到了同样的问题。Gitlab 运行器会阻止子进程以及子树中的任何进程。这会导致命令disown不起作用。分叉,也nohup不起作用。

我能想到的唯一解决方案是使用at命令https://linux.die.net/man/1/at

基本上,我将命令放入脚本中然后执行:

at new < my_script.sh。这样就成功退出并在后台启动了我的程序。

相关内容