Python+;Ubuntu Linux+;nohup错误:[1]+;出口
我有一个python脚本,Python+;Ubuntu Linux+;nohup错误:[1]+;出口,python,linux,python-2.7,ubuntu,nohup,Python,Linux,Python 2.7,Ubuntu,Nohup,我有一个python脚本,practice\u one.py,我希望它能在Ubuntu Linux中永远运行,并具有以下功能: while True: # Code 我尝试了nohup-python-practice\u-one.py&,但得到了消息nohup:忽略输入并将输出附加到“nohup.out” 然后,当我按enter键时,会输出另一条消息:[1]+Exit nohup python practice_one.py 为什么它只是自动退出?我可能做错了什么 编辑 尝试: n
practice\u one.py
,我希望它能在Ubuntu Linux中永远运行,并具有以下功能:
while True:
# Code
我尝试了nohup-python-practice\u-one.py&
,但得到了消息nohup:忽略输入并将输出附加到“nohup.out”
然后,当我按enter键时,会输出另一条消息:[1]+Exit nohup python practice_one.py
为什么它只是自动退出?我可能做错了什么
编辑
尝试:
nohup python practice\u one.py/dev/null&
获取[1]61122
然后当我按enter键时,我得到了[1]+退出nohup python practice\u one.py/dev/null&
它过去可以工作,但现在退出了。。现在会出现什么问题?第一个不是错误-它只是意味着nohup将捕获标准输出并将其存储在nohup.out中。如果要使所有内容静音,请使用:
nohup python practice_one.py &>/dev/null
在代码中,应该有一个中断。我的意思是;你应该有一个退出状态,即使你不会达到它。在exist状态下,可以指定使while循环变为true 资料来源:
我建议改为使用for循环 我通常在三种情况下会遇到这种情况:
nohup
运行脚本之前,请确保脚本本身工作正常(这实际上是第一件要尝试的事情)这是nohup的正常行为。 要避免这种情况,请尝试:
nohup python my_script.py </dev/null &>/dev/null &
nohup python my_script.py/dev/null&
我建议您最好使用双叉魔法
作为守护进程运行长时间运行的程序,而不是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
检查它。设置脚本的执行权限
chmod +x practice_one.py
尝试关闭所有文件描述符
nohup ./practice_one.py <&- 1>&- 2>&- &
nohup./practice\u one.py&-2>&-&
我同意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
因此,请尝试简化脚本操作,通过注释代码和测试找出问题所在。我刚刚遇到了这个问题。我很确定你的代码有问题。否则,应该没有退出消息。所有内容都被静音,但我如何检查它是否正在运行?嗯,
ps aux | grep python
?为什么像4EAST这样的字符串会被识别为4%EF%BF%EF%BF%BD等,这取决于文本和shell编码,terminal representation等。plus超出了您最初问题的范围。当我运行命令查看是否正在运行nohup时,它应该在列表上显示什么?不要相信我在nohup.out
中看到任何错误消息的nohupLook。在循环体中确实有任何代码,对吗?我将通过在脚本上添加python shebang来开始解决这个问题,例如#/usr/bin/env python
。接下来,我将运行这个bash
命令,以确保脚本对所有用户都是可执行的:chmod+xpractice\u one.py
。接下来,我将在shebang之后但在其他任何操作之前,向外部文件添加一个简单的写操作,例如,将open(“my_file.txt”,“w”)作为file:file.write(“OK”),然后我将尝试再次运行该文件,查看外部文件是否打印了“OK”。如果你尝试了这一切,回复我在这步与结果,这样我可以尝试帮助进一步你可以张贴你的脚本的地方?也许可以学习一些新的东西。如果“它过去可以工作,但现在退出了…”,那么问题不可能出在司机身上。每个人都做过这样的事:-)不要解决问题。。。(脚本退出的事实)这是“答案”,因为该问题包含的细节太少,不足以说明其他问题。我的赌注是#4……)