[原创] 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 &
上一篇: 标杆管理适不适合变革型领导
下一篇: 商务谈判的技巧
推荐阅读
-
pytorch中Schedule与warmup_steps的用法说明
-
MySQL提供与Linux绑定的数据库下载_MySQL
-
js中事件的处理与浏览器对象示例介绍_javascript技巧
-
比较全面的event对像在IE与FF中的区别 推荐_javascript技巧
-
ThinkPHP中SHOW_RUN_TIME不能正常显示运行时间的解决方法 原创,thinkphprun_PHP教程
-
PHP中的浅复制与深复制的实例详解
-
php中++i 与 i++ 的区别_php技巧
-
关于python中的__init__与__new__以及__call__三个方法的简单介绍
-
JavaScript中的原型与原型链详解
-
Android中ACTION_CANCEL的触发机制与滑出子view的情况