我有一个运行的.py文件:
python a.py&
我正在使用ssh来运行命令,之后我必须注销。经过一段时间后,我发现该过程已退出。我怀疑是Linux发送了一些信号吗?我想如果我可以制作守护进程那么我可以避免这个吗?
答案 0 :(得分:7)
虽然nohup会起作用,但这是一个快速而肮脏的解决方案。要制作正确的守护程序进程,您需要使用SysV init或(如果您运行的是Ubuntu 6.10+或Fedora 9+)upstart。
这是一个简单的脚本,它启动a.py并在它被杀死时重新启动它(在5分钟内最多5次):
respawn
respawn limit 5 300
exec python /path/to/a.py
然后将该脚本放入/etc/init/
。
Upstart也有很多选择。查看Quick Start教程。
答案 1 :(得分:5)
答案 2 :(得分:4)
我对Brian Clapper的daemonize.py
感到非常满意,基于FreeBSD的daemon(1)
:
http://software.clapper.org/daemonize/
http://github.com/bmc/daemonize
自2009年1月起,PEP 3143包含指向拟议参考实施,设计目标,引文(史蒂文斯)和其他来源的链接。
答案 3 :(得分:3)
使用' nohup'运行它在shell退出时忽略信号:
nohup python a.py &
答案 4 :(得分:2)
您还可以使用屏幕实用程序,允许您在单个终端窗口或远程终端会话中访问多个单独的终端会话。
这意味着您可以设置屏幕会话(使用您选择的名称),在其中启动程序(例如使用&),从会话中分离,然后重新连接。
开始一个未命名的屏幕。
$ screen
要创建具有特定名称的新会话,请使用:
$ screen -S backup
- 这两个命令都创建了一个新的持久会话,您可以将它用作常规终端窗口,即发出命令和运行脚本。
如果您想在不终止会话的情况下离开会话,请使用:
Ctrl+a d command (press and hold Ctrl, press and hold a, then press d) to detach from the session.
要查看全局屏幕列表:
$ screen -ls
将正在运行的屏幕附加到控制台:
$ screen -R
当屏幕正在运行时,可以使用以下键组合并将其附加到控制台。所有关键的组合都是在按下控制的同时开始的。
ctrl+a d - detach the screen, and let it run without user interface (as described above)
ctrl+a c - create a new terminal
ctrl+a A - set the name of the current terminal
ctrl+a n - switch to next terminal
ctrl+a p - switch to prev terminal
ctrl+a " - list the of terminals