我通常使用:
nohup python -u myscript.py &> ./mylog.log & # or should I use nohup 2>&1 ? I never remember
启动一个即使退出后仍想继续运行的后台Python进程,并且:
ps aux |grep python
# check for the relevant PID
kill <relevantPID>
它可以工作,但是执行所有这些步骤很烦人.
我读过一些方法,您需要将PID保存到某个文件中,但这更加麻烦.
有没有一种干净的方法可以轻松启动/停止Python脚本?喜欢:
startpy myscript.py # will automatically continue running in
# background even if I log out
# two days later, even if I logged out / logged in again the meantime
stoppy myscript.py
或者可以将这很长时间的nohup python -u myscript.py& ./mylog.log&是用脚本的shebang编写的,这样我就可以用./myscript.py轻松启动脚本,而不用写冗长的nohup行?
注意:我正在寻找一两个线的解决方案,我不想为此操作编写专用的systemd服务.
解决方法:
据我所知,对于在远程系统上运行后台脚本的问题,只有两种(或三种或四种?)解决方案.
1)nohup
nohup python -u myscript.py > ./mylog.log 2>&1 &
1之二)
与上面相同,略有不同,因为它实际上将程序删除到了外壳作业列表中,从而阻止了SIGHUP的发送.
2)屏幕(或接近建议的tmux)
Here,您将找到屏幕的起点.
有关后台进程如何工作的详细说明,请参见此post.另一个相关的post.
3)重击
另一个解决方案是编写两个可以执行此任务的bash函数:
mynohup () {
[[ "$1" = "" ]] && echo "usage: mynohup python_script" && return 0
nohup python -u "$1" > "${1%.*}.log" 2>&1 < /dev/null &
}
mykill() {
ps -ef | grep "$1" | grep -v grep | awk '{print $2}' | xargs kill
echo "process "$1" killed"
}
只需将以上函数放入您的〜/ .bashrc或〜/ .bash_profile中,并将其用作普通的bash命令即可.
现在,您可以完全按照您的指示进行操作:
mynohup myscript.py # will automatically continue running in
# background even if I log out
# two days later, even if I logged out / logged in again the meantime
mykill myscript.py
4)守护进程
这个daemon module非常有用:
python myscript.py start
python myscript.py stop