我使用 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 放在脚本调用前面。sleep
dbus-send
disown
.gitlab-ci.yml
这些都不会带来成功。
有什么想法吗,如何实现这一点?
谢谢
答案1
很抱歉这么晚才回复。我最近也遇到了同样的问题。Gitlab 运行器会阻止子进程以及子树中的任何进程。这会导致命令disown
不起作用。分叉,也nohup
不起作用。
我能想到的唯一解决方案是使用at
命令https://linux.die.net/man/1/at
基本上,我将命令放入脚本中然后执行:
at new < my_script.sh
。这样就成功退出并在后台启动了我的程序。