美文网首页
linux 下后台运行python脚本

linux 下后台运行python脚本

作者: 萌木盖 | 来源:发表于2019-01-23 10:20 被阅读0次

    &符号

    这两天要在服务器端一直运行一个Python脚本,当然就想到了在命令后面加&符号

    $ python /data/python/server.py >python.log &
    


    说明:

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

    使用nohup(not hang up)

    $ nohup python /data/python/server.py > python.log3 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窗口(我用的是SecureCRT,用的比较多的还有Xshell),而不用再输入exit这个命令来退出shell了

    $ ps aux|grep python
    tomener 1885  0.1  0.4  13120  4528 pts/0    S    15:48   0:00 python /data/python/server.py
    tomener 1887  0.0  0.0   5980   752 pts/0    S+   15:48   0:00 grep python
    

    现在当我们直接关闭shell窗口,再连接上服务器,查看Python的进程,发现进程还在

    但是,在python运行中却查看不到输出!

    因为:

    python的输出有缓冲,导致python.log3并不能够马上看到输出。

    使用-u参数,使得python不启用缓冲。

    所以改正命令,就可以正常使用了

    $ nohup python -u test.py > out.log 2>&1 &
    

    nohup和&的区别

    • & : 指在后台运行
    • nohup : 不挂断的运行,注意并没有后台运行的功能,,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行

    &是指在后台运行,但当用户推出(挂起)的时候,命令自动也跟着退出

    那么,我们可以巧妙的吧他们结合起来用就是

    nohup COMMAND &

    这样就能使命令永久的在后台执行

    例如:

    1.sh test.sh &

    将sh test.sh任务放到后台 ,即使关闭xshell退出当前session依然继续运行,但标准输出和标准错误信息会丢失(缺少的日志的输出)

    将sh test.sh任务放到后台 ,关闭xshell,对应的任务也跟着停止。

    1. nohup sh test.sh

      将sh test.sh任务放到后台,关闭标准输入,终端不再能够接收任何输入(标准输入),重定向标准输出和标准错误到当前目录下的nohup.out文件,即使关闭xshell退出当前session依然继续运行。
    2. nohup sh test.sh &

      sh test.sh任务放到后台,但是依然可以使用标准输入,终端能够接收任何输入,重定向标准输出和标准错误到当前目录下的nohup.out文件,即使关闭xshell退出当前session依然继续运行。

    任务前后台的切换

    shell支持作用控制,有以下命令实现前后台切换:

    1. command &让进程在后台运行
    2. jobs 查看后台运行的进程
    3. fg %n 让后台运行的进程n到前台来
    4. bg %n 让进程n到后台去
    5. kill %n 杀死job

      <font color="Crimson">PS: “n” 为jobs命令查看到的job编号,不是进程编号.
        fgbgjobs&ctrl + z 都是跟系统任务有关的</font>

    一、&

    这个用在一个命令的最后,可以把这个命令放到后台执行

    python test.py &
    

    二、ctrl + z

    可以将一个正在前台执行的命令放到后台,并且暂停

    三、jobs

    查看当前有多少在后台运行的命令

    jobs
    [1]-  Stopped                 vim ~/.bash_profile
    [2]+  Stopped                 vim /etc/profile
    

    四、fg

    将后台中的命令调至前台继续运行
    如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)。

    fg %1
    

    五、bg

    将一个在后台暂停的命令,变成继续执行
    如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)。

    bg %1
    [1]+ vim ~/.bash_profile &
    
    [1]+  Stopped                 vim ~/.bash_profile
    

    六、kill

    杀死jobs中具体jobnumber

    jobs
    [1]+  Stopped                 vim ~/.bash_profile
    [2]-  Stopped                 vim /etc/profile
    
    杀死 jobnumber=1:
    kill %1
    
    [1]+  Stopped                 vim ~/.bash_profile
    在查询下jobs:
    jobs
    [2]+  Stopped                 vim /etc/profile
    

    补充

    最近使用nohup创建了一个后台进程,默认日志输出到了nohup.out文件中,程序跑起来也就没再管, 过了大约一周,发现硬盘空间不够了,于是查找原因,发现这个nohup.out文件已经到了70G了,导致硬 盘空间不足了。
    解决方案 :

    只输出错误信息到日志文件

    nohup ./program >/dev/null 2>log &
    

    什么信息也不要

    nohup ./program >/dev/null 2>&1 &
    

    部分内容抄袭此博文

    相关文章

      网友评论

          本文标题:linux 下后台运行python脚本

          本文链接:https://www.haomeiwen.com/subject/cuqjjqtx.html