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查不到背景环境中的工作。

    菜鸟笔记,仅为个人笔记

    来源:DreamingBetter

    物联沃分享整理
    物联沃-IOTWORD物联网 » Linux – Python程序nohup后台运行

    发表评论