作者:bjkml | 来源:互联网 | 2023-02-03 14:06
我有一个python脚本,practice_one.py
我希望它在Ubuntu Linux中永远运行,并具有以下内容:
while True:
# Code
我尝试了nohup python practice_one.py &
但得到了消息nohup: ignoring input and appending output to ‘nohup.out’
.
然后当我按下回车键时,输出另一条消息: [1]+ Exit nohup python practice_one.py
怎么会自动退出?我能做错什么?
编辑
尝试:
nohup python practice_one.py /dev/null &
并获得[1] 61122
然后当我按回车键我有[1]+ Exit nohup python practice_one.py /dev/null &
它曾经工作但现在退出..现在可能是什么问题?
1> Ash..:
我通常在三种情况下面对这种情况:
当while循环中发生异常时.
在代码中的某处我有pdb.set_trace()这是一个调试断点.
在代码中的某处,请求来自用户的输入,如raw_input("请输入内容:")
检查您的代码以排除这三个原因.
不要担心第一条消息,它只是告诉你nohup在工作.
编辑
在运行脚本之前,请nohup
确保脚本本身正常工作(这实际上是第一次尝试).
2> Fujiao Liu..:
我建议您最好使用double fork magic
长时间运行的程序作为守护进程而不是nohup
.它易于调试,您的程序不需要外部工具nohup
.
daemon.py
import sys
import os
# double fork magic
def daemonize():
os.umask(0)
try:
pid = os.fork()
except OSError:
sys.exit(0)
if pid > 0:
sys.exit(0)
os.setsid()
try:
pid = os.fork()
except OSError:
sys.exit(0)
if pid > 0:
os._exit(0)
os.chdir('/')
import resource # Resource usage information.
maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1]
if (maxfd == resource.RLIM_INFINITY):
maxfd = 1024
# Iterate through and close all file descriptors.
for fd in range(0, maxfd):
try:
os.close(fd)
except OSError: # ERROR, fd wasn't open to begin with (ignored)
pass
fd = os.open(os.devnull, os.O_RDWR)
os.dup2(fd, sys.stdin.fileno())
os.dup2(fd, sys.stdout.fileno())
os.dup2(fd, sys.stderr.fileno())
test.py
from daemon import daemonize
import time
def test():
while True:
time.sleep(10)
if __name__ == '__main__':
daemonize() # you could comment this line before you make sure your program run as you expect
test()
现在,使用python test.py
它作为守护进程运行,您可以使用ps aux | grep test.py
它来检查它.