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@linuxidc tmp]# sh test.sh 循环次数 20 第0次循环 第1次循环 第2次循环 ^C 此时不论是直接 Ctrl+c 或 关闭当前ssh连接, 都会导致进程停止 [root@linuxidc tmp]# sh test.sh > test.out ^C 此时进程仍在前端跑, 查看 test.out 文件会发现在输出, 此时不论是直接 Ctrl+C 或 关闭当前ssh连接, 都会导致进程停止 单独使用 & [root@linuxidc tmp]# sh test.sh & [1] 111418 [root@linuxidc tmp]# 循环次数 20 第0次循环 第1次循环 第2次循环 ^C [root@linuxidc tmp]# 第3次循环 第4次循环 第5次循环 ^C [root@linuxidc tmp]# 第6次循环 第7次循环 第8次循环 第9次循环 第10次循环 第11次循环 此时进程在后台跑, 同时默认会输出到屏幕上. 此时 Ctrl+c 无效, 即进程忽略了 SIGINT 信号. 但若是直接关闭ssh连接(会话), 则该进程会被关闭, 这是因为进程受到了 SIGHUP 信号影响. 系统对SIGHUP信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。 [root@linuxidc tmp]# sh test.sh > test.out & [4] 111758 [root@linuxidc tmp]# 使进程在后台跑, 输出被重定向到指定文件 可用 jobs -l 获取当前的所有后台进程 [root@linuxidc tmp]# jobs -l [2]+ 113043 Running sh test.sh > /dev/null & 单独使用 nohup [root@linuxidc tmp]# nohup sh test.sh > test.out 2>&1 运行后是在前端跑, 若关闭会话, 进程不受影响. 但此时 Ctrl+c会结束进程. nohup + & [root@linuxidc tmp]# nohup sh test.sh & [2] 112987 [root@linuxidc tmp]# nohup: 忽略输入并把输出追加到"nohup.out" [root@linuxidc tmp]# 忽略 Ctrl+c 以及 会话关闭的影响, 进程可以在后台持续运行. 若会话未关闭, 可通过 jobs -l 查看当前该进程 [root@linuxidc tmp]# jobs -l [1]+ 112987 Running nohup sh test.sh & (编辑:银川站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |