我有一个名为bgservice.py
的Python脚本,它是我构建的web服务的一部分。 我想要它始终运行,即使在注销SSH之后也是如此。我该怎么做?
运行nohup python bgservice.py &
可以使脚本忽略挂起信号并继续运行。输出将被放置在nohup.out
中。
理想情况下,您应该像使用supervise
一样运行您的脚本,这样如果(当)脚本死亡,它可以被重新启动。
Ctrl+Z
(暂停该进程)
bg
(在后台重新启动该进程)
disown %1
(假设这是作业#1,请使用jobs
来确定)
首先,您需要在Python脚本中添加shebang行,它看起来像下面这样:
#!/usr/bin/env python3
如果您安装了多个版本的Python,则需要此路径,并且/usr/bin/env
将确保使用您$$PATH
环境变量中的第一个Python解释器。您也可以硬编码您的Python解释器路径(例如#!/usr/bin/python3
),但这不够灵活,也不便于在其他计算机上移植。接下来,您需要设置文件权限以允许执行:
chmod +x test.py
&
使得脚本在后台运行:nohup /path/to/test.py &
nohup python /path/to/test.py &
nohup.out
文件中,除非您像这样指定输出文件:nohup /path/to/test.py > output.log &
nohup python /path/to/test.py > output.log &
/dev/null
,那么输出会发送到指定位置。# doesn't create nohup.out
nohup command >/dev/null 2>&1
如果你正在使用nohup
,那可能意味着你想通过在整个命令结尾添加另一个&
来将命令在后台运行:
# runs in background, still doesn't create nohup.out
nohup command >/dev/null 2>&1 &
你可以使用以下命令找到 进程
及其 进程 ID
:
ps ax | grep test.py
# or
# list of running processes Python
ps -fA | grep python
ps
代表进程状态。
如果你想停止执行,可以使用kill命令kill它:
kill PID
备选答案:tmux
tmux
tmux
中启动您想要的进程,例如python3 main.py
Ctrl+b
然后d
离开tmux
会话现在安全退出远程计算机。当您回来时,使用tmux attach
重新进入tmux
会话。
如果您想启动多个会话,请使用Ctrl+b
然后$
为每个会话命名。然后输入您的会话名称。
要列出所有会话,请使用tmux list-sessions
要附加运行会话,请使用tmux attach-session -t <session-name>
。
以下是使用装饰器在Python中的简单解决方案:
import os, time
def daemon(func):
def wrapper(*args, **kwargs):
if os.fork(): return
func(*args, **kwargs)
os._exit(os.EX_OK)
return wrapper
@daemon
def my_func(count=10):
for i in range(0,count):
print('parent pid: %d' % os.getppid())
time.sleep(1)
my_func(count=10)
#still in parent thread
time.sleep(2)
#after 2 seconds the function my_func lives on is own
当然,你可以用你的代码替换bgservice.py
文件中的内容来代替my_func
。
试试这个:
nohup python -u <your file name>.py >> <your log file>.log &
您可以在screen中运行上述命令并退出screen。
现在,您可以通过以下方式跟踪Python脚本的日志:tail -f <your log file>.log
要终止脚本,您可以使用ps -aux和kill命令。
zsh shell有一个选项,可以使所有后台进程都使用nohup运行。
在~/.zshrc
文件中添加以下行:
setopt nocheckjobs #don't warn about bg processes on exit
setopt nohup #don't kill bg processes on exit
然后,您只需要运行以下进程:python bgservice.py &
,您将不再需要使用nohup命令。
我知道并不是很多人使用zsh,但它是一个非常酷的shell,我强烈推荐使用。
nohup: ignoring input and appending output to
nohup.out'`,并且当我按回车键时,该进程以状态1退出。出了什么问题? - Santosh Ghimiresomecommand &
之后,它会打印pid,例如[1] 12345
。否则,您可以使用$!
。 - Tony Beta Lambda