Linux - Python程序nohup后台运行

nohup

  • nohup指不断地运行,是no hang up的缩写,指不间断,不挂断。运行一个进程的时候,不想让其在你退出账号时关闭,即可用nohup。
  • nohup在不规定的情况下,所以输出内容会到nohup.out中。

运行Python程序

nohup python my.py >> my.log 2>&1 &
# 或者
nohup python my.py >> nohup.out 2>&1 &
# 或者
nohup python my.py &  # 这种写法和上面第二种写法等价

2>&1 错误内容重定向到标准输出

0 表示stdin标准输入,用户键盘输入的内容
1 表示stdout标准输出,输出到显示屏的内容
2 表示stderr标准错误,报错内容
2>&1 是一个整体,> 左右不能有空格,即将错误内容重定向输入到标准输出中去。

& 后台运行

  • &为后台运行
  • 第一条代码,以python环境不间断的运行my.py这个脚本,并且将脚本输出的内容重定向输入my.log中(>>意为追加,如果用>会让其中的内容清空)
  • nohup python my.py >> my.log 2>&1 & 和 nohup python my.py 1 >> my.log 2>&1 & 相同,只是1(标准输入)被省略了,而后面的my.log 2>&1 又将2(错误内容)输入到标准输出,然后前面的标准输出又输入到my.log中,意思错误和标准内容都会输出到my.log中,其实代码可拆成两块。即:
nohup python my.py >> my.log 2>&1 &
# 等价于下面两行的内容
nohup python my.py 1>> my.log &
nohup python my.py 2>> my.log &
  • 上面代码就是将错误和标准都输出到my.log,最初的代码只是简化了。
    而加2>&1中的&是为了区别文件1和1(标准输出),假如为2>1,那么不就成了将错误内容输出到文件1中。

可能存在的问题

生成了nohup.out文件,但是内容始终是空的。

原因与解决

python的输出又缓冲,导致nohup.out并不能够马上看到输出。
-u 参数,使得python不启用缓冲。

nohup python -u my.py >> nohup.out 2>&1 &

我只是将我用到的部分转载过来,下面是原文出处。下文我会加点自己的遇到的问题。
版权声明:本文为CSDN博主「小孟Tec」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_38024592/article/details/103336210

执行上面命令后

执行后一直是空行,就像在前台运行该程序一样,没弹出命令行输入提示,这时按回车或者CTRL+C都会使程序终止。这时只需直接输入要用的命令即可。比如:输入jobs查看当前终端后台执行的任务(ps 和 jobs的区别在于:jobs 只能查看当前终端后台执行的任务,换了终端就看不见了。而ps命令适用于查看瞬时进程的动态,可以看到别的终端的任务。)

查看当前终端后台运行的任务

jobs -l选项可显示当前终端所有任务的PID,jobs的状态可以是running,stopped,Terminated。+ 号表示当前任务,- 号表示后一个任务。

查看当前的所有进程

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

# 可以加管道符
ps -aux | grep "test.sh"

关闭当前后台运行的命令

kill命令:结束进程

 (1)通过jobs命令查看jobnum,然后执行   kill %jobnum (%jobnum 表示此处用job的id填充,不需要输入%)

 (2)通过ps命令查看进程号PID,然后执行  kill %PID

   如果是前台进程的话,直接执行 Ctrl+c 就可以终止了

前后台进程的切换与控制

1)fg命令

   功能:将后台中的命令调至前台继续运行

   如果后台中有多个命令,可以先用jobs查看jobnun,然后用 fg %jobnum 将选中的命令调出。

 (2)Ctrl + z 命令

   功能:将一个正在前台执行的命令放到后台,并且处于暂停状态

 (3)bg命令

   功能:将一个在后台暂停的命令,变成在后台继续执行

   如果后台中有多个命令,可以先用jobs查看jobnum,然后用 bg %jobnum 将选中的命令调出继续执行。

点击查看:进程的挂起与恢复、ps查看进程及其状态含义

nohup与bg区别

nohup:特点是可以关闭shell窗口,但是没有暂停功能,用ps查看,kill杀死
ctrl+z挂起 或 bg:特点是不可以关闭shell窗口,具有暂停功能,用jobs查看,关闭shell窗口或者kill来杀死。

ctrl+Z 将现在前景的、运行的程序,变成背景的、暂停的工作。
jobs   查看背景中的工作编号。 jobs -l可以查看工作进程编号。
fg %1  调回前景环境运行。将方括号编号为[1]的背景的、暂停的程序,变成前景的、运行的程序。
bg %2  将背景环境中暂停的工作运行起来。将方括号编号为[2]的背景的、暂停的程序,变成背景的、运行的程序。

区别:

  1. 后台运行(nohup)和背景运行(bg)不一样。在背景(bg)中的、运行的程序不能被ctrl+C 终止掉,但是可以关闭shell终端或者kill来终止掉。后台运行(nohup)的程序,关闭shell也不能终止掉,需用kill来终止掉。
  2. 背景环境中的程序依赖当前shell窗口存活。背景环境中的进程叫工作。一个shell中的背景环境中的工作,可以用jobs查看,当前shell窗口关闭了背景中的工作也就关闭了。所以在其他shell窗口中,jobs查不到背景环境中的工作。

菜鸟笔记,仅为个人笔记

你可能感兴趣的:(Linux,python,linux)