我需要通过 SSH 连接到嵌入式设备,启动后台程序,然后断开连接并保持后台进程运行。问题是嵌入式设备正在使用 ash shell(不是 bash 或其他任何东西),所以 nohup 和 screen 不可用。我还没有找到任何方法来断开 ash 中的进程。有没有办法在 Ember 中做到这一点?
最佳答案
替代方案:
nohup command &
使用巧妙的括号:
(( command & ) & )
而且如果你想删除标准输入/标准输出:
(( command 0<&- &>/dev/null &) &)
解释
TLDR : 我们让一个子shell启动一个子shell来执行一个命令,从而启动一个孤儿进程。孤儿只会在 init 进程死亡时死亡。
putting subshell in background vs putting command in background的区别是subshells有不同 process states
当您注销 SSH session 或关闭任何
sh
时shell session SIGHUP
信号被发送到该 shell 的所有子进程。我们在这里所做的是我们启动了一个子shell来启动一个子shell,因此disowning开始的过程。我们现在有一个 orphan process .这个孤立的进程不再有一个 PPID(父进程 ID)来标识我们的 SSH session 。所以当我们注销 SSH session 和一个
SIGHUP
被发送到我们所有的子进程,它永远不会命中孤儿。
关于linux - 如何在 ash shell 中保持程序在后台运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29704358/