python脚本在linux系统后台运行

背景:将我的模型移植到了云服务器上,但是用putty连接服务器运行脚本时,我拖动putty的窗口训练就会被打断。为了解决这个问题,必须把python脚本放到后台去运行,这样即使我关闭了 putty连接程序也会继续运行。

经过查询总结一下:

1、&

用途:在后台运行

一般两个一起用

command &

python train_model.py >XXX.log &

说明:     
1、 > 表示把标准输出(STDOUT)重定向到 那个文件,这里重定向到了python.log    
2、 & 表示在后台执行脚本,这样可以到达目的,但是,我们退出shell窗口的时候,必须用exit命令来退出,
否则,退出之后,该进程也会随着shell的消失而消失(退出、关闭)

2、nohup

用途:不挂断地运行命令。

语法:nohup Command [ Arg … ] [ & ]

  无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。

  如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

  如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。

nohub python train_model.py > XXX.log 2>&1 &

说明:
1、 1是标准输出(STDOUT)的文件描述符,2是标准错误(STDERR)的文件描述符     1> python.log 简化为 > python.log,表示把标准输出重定向到python.log这个文件
2、2>&1 表示把标准错误重定向到标准输出,这里&1表示标准输出   
为什么需要将标准错误重定向到标准输出的原因,是因为标准错误没有缓冲区,而STDOUT有。   
这就会导致  commond > python.log  2> python.log 文件python.log被两次打开,而STDOUT和 STDERR将会竞争覆盖,这肯定不是我门想要的
3、现在可以直接关闭shell窗口,而不用再输入exit这个命令来退出shell了

3、在python运行中却查看不到输出

因为:
python的输出有缓冲,导致XXX.log并不能够马上看到输出。
使用-u参数,使得python不启用缓冲。
所以改正命令,就可以正常使用了

nohup python -u train_model.py > XXX.log 2>&1 &

4、查看运行的后台进程

1、jobs  不会输出进程号

2、jobs -l 输出进程号

3、ps -ef

ps -aux|grep XXX.py
 a:显示所有程序 
 u:以用户为主的格式来显示 
 x:显示所有程序,不以终端机来区分

用ps -def | grep查找进程很方便,最后一行总是会grep自己

用grep -v参数可以将grep命令排除掉

ps -aux|grep XXX.py| grep -v grep

再用awk提取一下进程ID

ps -aux|grep XXX.py| grep -v grep | awk '{print $2}'

 

你可能感兴趣的:(python脚本在linux系统后台运行)