启动/停止后台Python进程,而不是nohup + ps aux grep + kill

时间:2016-01-08 23:36:46

标签: python linux bash nohup

我通常使用:

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服务

2 个答案:

答案 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及其中运行的进程仍将继续运行。