• [原创] Linux 中的 nohup 与 &


    背景

    一直没搞清楚 nohup& 的区别, 看着公司里遗留的shell, 也就稀里糊涂地用着... 这是很糟糕的态度

    结论放前面

    &

    使进程在后台运行, 默认输出到标准输出(即当前屏幕), 除非重定向输出.

    此时忽略 SIGINT 信号.

    若关闭会话, 则进程会结束


    nohup

    进程仍旧在前台跑, 默认输出到 nohup.out .

    此时进程忽略 SIGHUP 信号, 关闭会话不影响进程.

    Ctrl+c会使进程中断


    nohup + &

    进程在后台跑, 忽略 SIGINT, SIGHUP 信号.

    测试

    repeat=${1:-20}
    echo 循环次数 $repeat
    counter=0
    while [ $counter -lt $repeat ]
    do
        echo 第${counter}次循环
        let "counter ++"
        sleep 1
    done
    echo 结束循环
    

    直接运行

    [root@yjx214 tmp]# sh test.sh
    循环次数 20
    第0次循环
    第1次循环
    第2次循环
    ^C
    
    

    此时不论是直接 Ctrl+c 或 关闭当前ssh连接, 都会导致进程停止

    [root@yjx214 tmp]# sh test.sh > test.out
    ^C
    
    

    此时进程仍在前端跑, 查看 test.out 文件会发现在输出, 此时不论是直接 Ctrl+C 或 关闭当前ssh连接, 都会导致进程停止

    单独使用 &

    [root@yjx214 tmp]# sh test.sh &
    [1] 111418
    [root@yjx214 tmp]# 循环次数 20
    第0次循环
    第1次循环
    第2次循环
    ^C
    [root@yjx214 tmp]# 第3次循环
    第4次循环
    第5次循环
    ^C
    [root@yjx214 tmp]# 第6次循环
    第7次循环
    第8次循环
    第9次循环
    第10次循环
    第11次循环
    
    

    此时进程在后台跑, 同时默认会输出到屏幕上.

    此时 Ctrl+c 无效, 即进程忽略了 SIGINT 信号.

    但若是直接关闭ssh连接(会话), 则该进程会被关闭, 这是因为进程受到了 SIGHUP 信号影响.

    系统对SIGHUP信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。
      

    [root@yjx214 tmp]# sh test.sh > test.out &
    [4] 111758
    [root@yjx214 tmp]#
    

    使进程在后台跑, 输出被重定向到指定文件

    可用 jobs -l 获取当前的所有后台进程

    [root@yjx214 tmp]# jobs -l
    [2]+ 113043 Running                 sh test.sh > /dev/null &
    

    单独使用 nohup

    [root@yjx214 tmp]# nohup sh test.sh > test.out 2>&1
    
    

    运行后是在前端跑, 若关闭会话, 进程不受影响.

    但此时 Ctrl+c会结束进程.

    nohup + &

    [root@yjx214 tmp]# nohup sh test.sh &
    [2] 112987
    [root@yjx214 tmp]# nohup: 忽略输入并把输出追加到"nohup.out"
    
    [root@yjx214 tmp]#
    

    忽略 Ctrl+c 以及 会话关闭的影响, 进程可以在后台持续运行.

    若会话未关闭, 可通过 jobs -l 查看当前该进程

    [root@yjx214 tmp]# jobs -l
    [1]+ 112987 Running                 nohup sh test.sh &
    
  • 相关阅读:
    android 工具类 DateUtil
    POJ1580 水题,积累!
    POJ1159,Palindrome
    iOS开发UI篇章 15-项目中的常见文件
    MongoDB:Map-Reduce
    三层架构下实现用户登陆C#
    Inno Setup 安装inf文件的一个例子
    delphi 主线程向子线程发送消息
    PeekMessage和GetMessage函数的主要区别
    delphi SPCOMM的一些用法注意
  • 原文地址:https://www.cnblogs.com/youjiaxing/p/10040376.html
Copyright © 2020-2023  润新知