• 【Linux】 nohup linux 后台运行输出


    后台运行新利器:tmux

    关于jobs 的用法 jobs

    遇到问题

    nohup python flush.py &

    这样运行,生成了nohup.out文件,但是内容始终是空的,试了半天也不行。浪费了不少时间。

    原因

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

    解决

    nohup python -u flush.py > flush.log 2>&1 &

    linux命令后台运行

       有两种方式:

       1. command & : 后台运行,你关掉终端会停止运行
       2. nohup command & : 后台运行,你关掉终端也会继续运行

       

    一、 简介 
        Linux/Unix 区别于微软平台最大的优点就是真正的多用户,多任务。因此在任务管理上也有别具特色的管理思想。
    我们知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务。而不能让程序在前台后台之间切换。而 Linux 提供了 fg 和bg命令,让你轻松调度正在运行的任务。假设你发现前台运行的一个程序需要很长的时间,但是需要干其他的事情,你就可以用Ctrl-Z ,挂起这个程序,然后可以看到系统提示:
    [1]+ Stopped /root/bin/rsync.sh
    然后我们可以把程序调度到后台执行:(bg 后面的数字为作业号)
    #bg 1
    [1]+ /root/bin/rsync.sh &
    用 jobs 命令查看正在运行的任务:
    #jobs
    [1]+ Running /root/bin/rsync.sh &
    如果想把它调回到前台运行,可以用
    #fg 1
    /root/bin/rsync.sh
    这样,你在控制台上就只能等待这个任务完成了。

    & 将指令丢到后台中去执行
    [ctrl]+z 將前台任务丟到后台中暂停
    jobs 查看后台的工作状态
    fg %jobnumber 将后台的任务拿到前台来处理
    bg %jobnumber 将任务放到后台中去处理
    kill 管理后台的任务

    二、&

    在Linux中,当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。实际上,这样是将命令放入到一个作业队列中了:

    $ ./test.sh &
    [1] 17208$ jobs -l
    [1]+ 17208 Running                 ./test.sh &
        在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:
    command >out.file 2>&1 &
    在上面的例子中,2>&1表示所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。 当你成功地提交进程以后,就会显示出一个进程号,可以用它来监控该进程,或杀死它。 
    例:查找名为“httpd.conf”的文件,并把所有标准输出和错误输出重定向到find.dt的文件中: 

    # find /etc/httpd/ -name "httpd.conf" -print >find.dt 2>&1 & 
    [2] 7832

     
    成功提交该命令之后,系统给出了它的进程号7832。 对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行,例如对正在前台执行的tesh.sh使用ctrl+z挂起它:

    $ ./test.sh
    [1]+ Stopped                 ./test.sh
    
    $ bg %1
    [1]+ ./test.sh &
    
    $ jobs -l
    [1]+ 22794 Running                 ./test.sh &
    $ echo $$
    21734
    
    $ nohup ./test.sh &
    [1] 29016
    
    $ ps -ef | grep test
    515      29710 21734 0 11:47 pts/12   00:00:00 /bin/sh ./test.sh
    515      29713 21734 0 11:47 pts/12   00:00:00 grep test
    $ setsid ./test.sh &
    [1] 409
    
    $ ps -ef | grep test
    515        410     1 0 11:49 ?        00:00:00 /bin/sh ./test.sh
    515        413 21734 0 11:49 pts/12   00:00:00 grep test

    但是如上方到后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号,或者se

    $ screen -dmS screen_test
    
    $ screen -list
    There is a screen on:
            27963.screen_test       (Detached)
    1 Socket in /tmp/uscreens/S-jiangfeng.
    
    $ screen -r screen_test
    

    tsid将将父进程设为init进程(进程号为1)
    上面的试验演示了使用nohup/setsid加上&使进程在后台运行,同时不受当前shell退出的影响。那么对于已经在后台运行的进程,该怎么办呢?可以使用disown命令:

    $ ./test.sh &
    [1] 2539
    
    $ jobs -l
    [1]+ 2539 Running                 ./test.sh &
    
    $ disown -h %1
    
    $ ps -ef | grep test
    515        410     1 0 11:49 ?        00:00:00 /bin/sh ./test.sh
    515       2542 21734 0 11:52 pts/12   00:00:00 grep test
    $ (./test.sh &)
    
    $ ps -ef | grep test
    515        410     1 0 11:49 ?        00:00:00 /bin/sh ./test.sh
    515      12483 21734 0 11:59 pts/12   00:00:00 grep test


    另外还有一种方法,即使将进程在一个subshell中执行,其实这和setsid异曲同工。方法很简单,将命令用括号() 括起来即可:
    注:本文试验环境为Red Hat Enterprise Linux AS release 4 (Nahant Update 5),shell为/bin/bash,不同的OS和shell可能命令有些不一样。例如AIX的ksh,没有disown,但是可以使用nohup -p PID来获得disown同样的效果。

    还有一种更加强大的方式是使用screen,首先创建一个断开模式的虚拟终端,然后用-r选项重新连接这个虚拟终端,在其中执行的任何命令,都能达到nohup的效果,这在有多个命令需要在后台连续执行的时候比较方便:

    关注公众号 海量干货等你
  • 相关阅读:
    IOS Charles(代理服务器软件,可以用来拦截网络请求)
    Javascript中addEventListener和attachEvent的区别
    MVC中实现Area几种方法
    Entity Framework Code First 中使用 Fluent API 笔记。
    自定义JsonResult解决 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
    序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
    An entity object cannot be referenced by multiple instances of IEntityChangeTracker 的解决方案
    Code First :使用Entity. Framework编程(8) ----转发 收藏
    Code First :使用Entity. Framework编程(6) ----转发 收藏
    Code First :使用Entity. Framework编程(5) ----转发 收藏
  • 原文地址:https://www.cnblogs.com/sowhat1412/p/12734387.html
Copyright © 2020-2023  润新知