nohup(no hang up) 解析

nohup command params1>nohup.out 2>&1 &

补充:试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出。

nohup command params1>aa.txt 2>&1 &

定义aa.txt为标准输出, 且将错误信息输出到标准输出2>&1就是这个意思

nohup command 1>nphup.out 2>abc.txt &

第三个字段可以为:params1 和1 或者省略

第五个字段 可以为任意文件名包括nohup.out

第八个字段可以为&1或文件名

nohup是永久执行
&是指在后台运行
运行 nohup --help
Run COMMAND, ignoring hangup signals. 可以看到是“运行命令,忽略挂起信号”
就是指,用nohup运行命令可以使命令永久的执行下去(加上后可以无视条件, 执行到底,无视关窗口, 但是与后台运行无关, 也就是说仅是加了一个强制命令)

yinhaibo@yinhaibo-OptiPlex-9020:~$ nohup sh 休息.sh
nohup: ignoring input and appending output to 'nohup.out     这里无视了input, 将output输入到nohup.out

实验发现关闭terminal并不能够终止。需要

Ctrl+c(这个只适用于没有关闭该terminal的情况下

或者 ps aux|grep 休息    查出pid      kill pid(所有情况

yinhaibo@yinhaibo-OptiPlex-9020:~$ ps aux|grep 休息.sh
yinhaibo  9269  0.0  0.0   4504  1644 pts/1    S+   18:13   0:00 sh 休息.sh
yinhaibo  9912  0.0  0.0  21292  1028 pts/20   S+   18:18   0:00 grep --color=auto 休息.sh
yinhaibo@yinhaibo-OptiPlex-9020:~$ kill 9269

 

和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行(只是后台, terminal窗口关闭即关闭)

关闭方式1:

yinhaibo@yinhaibo-OptiPlex-9020:~$ fg
sh 休息.sh
ctrl + c

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

那么,我们可以巧妙的吧他们结合起来用就是
nohup COMMAND &
这样就能使命令永久的在后台执行
举个例子nohup tail -f nohup.out
然后退出登录,再连接,用ps -ef 你会还能看到在运行
ps -ef
root      3457     1  0 18:20 ?        00:00:00 tail -f nohup.out


另外,nohup执行后,会产生日子文件,把命令的执行中的消息保存到这个文件中,一般在当前目录下,如果当前目录不可写,那么自动保存到执行这个命令的用户的home目录下,例如root的话就保存在/root/下


这个我们常在运行命令和脚本中常用到的


转载自http://blog.csdn.net/zhang_red/article/details/52789691

https://www.cnblogs.com/zhenghongxin/p/7029173.html

linux shell中"2>&1"含义

在计划任务中经常可以看到。例如我们公司的计划任务举例:

*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testOne >/dev/null 2>&1
*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testTwo >/dev/null 2>&1

对于& 1 更准确的说应该是文件描述符 1,而1标识标准输出,stdout。
对于2 ,表示标准错误,stderr。
2>&1 的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了 /dev/null。那么标准错误也会输出到/dev/null

可以把/dev/null 可以看作"黑洞". 它等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到.

偶尔也可以把 & 在命令的最后加上,表示让程序后台执行。

为何2>&1要写在后面?

index.php task testOne >/dev/null 2>&1

我们可以理解为,左边是标准输出,好,现在标准输出直接输入到 /dev/null 中,而2>&1是将标准错误重定向到标准输出,所以当程序产生错误的时候,相当于错误流向左边,而左边依旧是输入到/dev/null中。

可以理解为,如果写在中间,那会把隔断标准输出指定输出的文件

你可以用

ls 2>1测试一下,不会报没有2文件的错误,但会输出一个空的文件1;
ls xxx 2>1测试,没有xxx这个文件的错误输出到了1中;
ls xxx 2>&1测试,不会生成1这个文件了,不过错误跑到标准输出了;
ls xxx >out.txt 2>&1, 实际上可换成 ls xxx 1>out.txt 2>&1;重定向符号>默认是1,错误和输出都传到out.txt了。

猜你喜欢

转载自blog.csdn.net/yjinyyzyq/article/details/85266453