我通常使用:
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
或者可以在脚本的shebang中编写这个长篇nohup python -u myscript.py &> ./mylog.log &
,以便我可以使用./myscript.py
轻松启动脚本,而不是编写长nohup行?
注意:我正在寻找一个或两个行解决方案,我不想为此操作编写专用的systemd服务。
答案 0 :(得分:3)
据我所知,在远程系统上运行后台脚本的问题只有两个(或者三个或者四个?)解决方案。
1)nohup
nohup python -u myscript.py > ./mylog.log 2>&1 &
1之二)否认
与上面相同,略有不同,因为它实际上将程序删除到shell作业列表,阻止了SIGHUP的发送。
2)屏幕(或者是neared建议的tmux)
Here您将找到屏幕的起点。
有关后台进程如何工作的详细说明,请参阅此post。另一个相关的post。
3)Bash
另一种解决方案是编写两个执行此任务的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
答案 1 :(得分:1)
您的意思是远程登录和退出(例如通过SSH)?如果是这样,一个简单的解决方案是安装tmux(终端多路复用器)。它为作为客户端在其下运行的终端创建服务器。使用tmux
打开tmux,键入命令,键入CONTROL+B+D
以从tmux'分离',然后在主终端键入exit以注销。重新登录时,tmux及其中运行的进程仍将继续运行。