【问题标题】:How to keep program running in background in ash shell如何在ash shell中保持程序在后台运行
【发布时间】:2015-06-24 14:37:14
【问题描述】:

我需要通过 SSH 连接到嵌入式设备,启动后台程序,然后断开连接并保持后台进程运行。问题是嵌入式设备正在使用 ash shell(不是 bash 或其他任何东西),所以 nohup 和 screen 不可用。我还没有找到任何方法来断开灰烬中的过程。有没有办法在灰中做到这一点?

【问题讨论】:

  • nohup 和 screen 都不是 bash 的一部分。您是否考虑过安装它们?
  • 窃取一些 C 代码来创建一个守护进程,它有很多,它只需要大约 30 sloc,让它把你的应用程序名称作为命令行参数,然后你就完成了。在嵌入式设备上安装新的“init.d”样式应用程序,在 SSH 登录和注销时运行它。
  • tmux 也应该可以解决问题。可以安装吗?
  • 唯一特定于 bash 的方法是使用 disown 的方法。其他所有选项都适用于 ash。

标签: linux shell ssh embedded-linux ash


【解决方案1】:

替代:

nohup command &

使用巧妙的括号:

(( command & ) & )

如果你想删除标准输入/标准输出:

(( command 0<&- &>/dev/null &) &)

说明

TLDR:我们让一个子shell 启动一个子shell 来执行一个命令,从而启动一个孤儿进程。孤儿只有在 init 进程终止时才会终止。

putting subshell in background vs putting command in background的区别在于subshells有不同的process states

当您注销 SSH 会话或关闭任何 sh shell 会话时,SIGHUP 信号将发送到该 shell 的所有子进程。我们在这里所做的是我们启动了一个子shell来启动一个子shell,因此disowning启动了进程。我们现在有一个orphan process。

这个孤立的进程不再有一个 PPID(父进程 ID)来标识我们的 SSH 会话。因此,当我们注销 SSH 会话并将 SIGHUP 发送到我们所有的子进程时,它永远不会命中孤儿。

【讨论】:

  • 哇,这确实有效,谢谢!想解释一下如何?
  • @Paul 希望有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 2021-06-24
相关资源
最近更新 更多