我已经阅读并理解了如何创建守护进程,但从我读到的所有内容中我从未真正理解为什么这是需要做的。
我读过,我们执行 fork-setsid-fork 来避免获得终端控制权的过程,但这是什么意思?如果我使用 & 在后台启动一个程序(例如 './script &' ),是什么使这个进程的执行与我正常运行一个将自身变成守护进程的程序不同?
这是否仅仅意味着如果我注销,后台进程将停止并且守护进程将继续运行?我真的很难理解“获得终端控制权”的事情。
这让我困扰的原因是因为我正在机器人上开发嵌入式 RPi,因此我需要让程序在启动时启动。目前我只是使用这样的命令从 rc.local 启动它们su user -c 'python /home/user/launcher.py &' &
。我在启动时从未遇到过程序启动的任何问题(我什至可以看到通过 SSH 连接到 RPi 时使用的进程ps -e
),但我想知道是否存在任何风险/是否是不好的做法。
答案1
这不仅仅是一个问题,每个问题都有很长的答案。简要地
如果我使用 & 在后台启动一个程序(例如 './script &' ),是什么使这个进程的执行与我正常运行一个将自身变成守护进程的程序不同?
在后台运行一个程序,它不再直接受终端控制(你不能简单地控制
^C
它),但它仍然可以写入终端并干扰你的工作。通常,守护进程会将自身与终端分离(除了分叉之外),并且其输出/错误将被重定向到文件。这是否仅仅意味着如果我注销,后台进程将停止并且守护进程将继续运行?
后台进程可以受到保护,
nohup
但除非其输出被重定向,否则关闭终端将阻止其写入,从而产生可能会停止它的错误。我想知道是否有任何风险/这是否是不好的做法。
除了跟踪程序的输出(和错误消息)的问题之外,还存在如果程序死机则重新启动的问题。服务脚本适合系统上其他服务的设计方式,提供或多或少标准的控制守护程序的方式。