我面临一个相当奇怪的情况:
- ssh 到 beaglebone(详细信息:uname -a = “Linux beaglebone 3.2.34 #1 Wed Nov 21 14:17:11 CET 2012 armv7l GNU/Linux”,ssh 服务器:Dropbear sshd v2012.55)
- 通过 screen、nohup 或 /etc/init.d/ 启动任何类型的进程
- 登出
- 重新 ssh 进入
- 观察到该过程不再存在..
当使用第二个 ssh 连接时,我可以观察到启动的进程在断开连接时被终止。
我见过类似的帖子什么确切地决定了后台作业是否在退出 shell 时被终止或被终止?,但仍然无法理解这种行为,这显然不是screen
其他被抛弃的进程应该工作的方式。
$ shopt huponexit
huponexit off
我不得不使用 cron 命令来维持这个过程
为什么断开连接时分离的进程会被终止?
您还发现其他值得寻找的东西吗?
答案1
nohup 不起作用似乎很奇怪,但是可以很容易地进行测试,如下所示:
{ sleep 999; echo $? > exitcode ; } &
fuser -1 -k /bin/sleep
expr $(cat exitcode) - 128
这将打印返回代码减 128,这正好是终止它的信号的编号。您可以通过以下方式列出它们:
kill -l
现在尝试这样做:
rm exitcode
{ nohup sleep 999; echo $? > exitcode; } &
fuser -1 -k /bin/sleep
ls -l exitcode
如果 nohup 工作正常,此时系统会提示您没有这样的文件。您可以通过以下方式再次检查:
fuser -15 -k /bin/sleep
expr $(cat exitcode) -128
并发现该值为 15。
编辑
你的最后一条评论很有启发性:这意味着 SIGHUP 不是发送给进程(在本例中为休眠),而是直接发送给你的 shell。当然,这只能由 Dropberar 来完成。经过一番研究,Dropbear 确实会在注销时终止所有用户进程。
您可以通过添加以下行来关闭这个烦人的功能
KillMode=process
在 /lib/systemd/ 中的 Service 节末尾[电子邮件保护]文件。然后重新启动或重启 Dropbear。