我有一个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 &
它曾经工作但现在退出..现在可能是什么问题?
我通常在三种情况下面对这种情况:
检查您的代码以排除这三个原因。
不要担心第一条消息,它只是告诉你nohup在工作。
编辑
nohup
运行脚本之前,请确保脚本本身正常工作(这实际上是第一次尝试)。我建议你最好使用double fork magic
来运行你的长期运行程序作为守护进程而不是nohup
。它很容易调试,你的程序不需要像nohup
这样的外部工具。
daemon.朋友
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.朋友
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不是问题所在:
Python代码
$ cat practice_one.py
while True:
print 'ok'
Nohup执行
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 &