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了。