使用nohup ps aux grep kill启动/停止后台Python进程

我通常使用:

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
上一篇:实现Xshell断开连接情况下Linux命令继续执行


下一篇:【疯狂挖坑】linux服务器尝试中的问题(nohup等)