我有一个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 &>/dev/null &
然后得到[1] 61122
然后当我按回车键时,我得到了[1]+ Exit nohup python practice_one.py </dev/null &>/dev/null &
它曾经工作,但现在退出了。现在可能有什么问题?
我通常在三种情况下遇到这种情况:
-
当 while 循环中发生异常时。
-
在代码中的某个地方,我有 pdb.set_trace((,这是一个调试断点。
-
当在代码中的某个地方,请求用户的输入,如raw_input("请输入一些内容:"(
检查代码以排除这三个原因。
不要担心第一条消息,它只是通知您nohup正在工作。
编辑
- 在使用
nohup
运行脚本之前,请确保脚本本身工作正常(这实际上是要尝试的第一件事(。
我建议您最好使用 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
来检查它。
我同意 Ash 的观点,您在脚本中遇到了一些麻烦。
我已经测试了您的方案,我向您保证nohup不是问题所在:
蟒蛇代码
$ cat practice_one.py
while True:
print 'ok'
诺胡普执行
m.ortiz.montealegre@CPX-XYR3G1DTHBU ~/python_excercises/nohup-python
$ nohup python practice_one.py &
[1] 10552
m.ortiz.montealegre@CPX-XYR3G1DTHBU ~/python_excercises/nohup-python
$ nohup: ignoring input and appending output to 'nohup.out'
m.ortiz.montealegre@CPX-XYR3G1DTHBU ~/python_excercises/nohup-python
$ ps
PID PPID PGID WINPID TTY UID STIME COMMAND
10552 15248 10552 9992 cons1 6758389 16:52:27 /usr/bin/python2.7
因此,请尝试简化脚本操作,通过注释代码并进行测试,找出问题所在,直到找到罪魁祸首。
设置脚本的执行权限
chmod +x practice_one.py
尝试关闭所有文件描述符
nohup ./practice_one.py <&- 1>&- 2>&- &
第一个不是错误 - 它只是意味着nohup将捕获STDOUT并将其存储在nohup.out中。如果要将所有内容静音,请使用:
nohup python practice_one.py &>/dev/null
在代码中,应该有一个中断。我的意思是;即使你不会达到它,你也应该有一个退出状态。在存在状态下,您可以指定使 while 循环变为 true。
来源: https://wiki.python.org/moin/WhileLoop
我建议改用 for 循环。
我刚刚遇到了这个问题。我很确定你的代码有问题。否则,不应有退出消息。
这是nohup的正常行为。要避免这种情况,请尝试:
nohup python my_script.py </dev/null &>/dev/null &