最近遇到一个问题,
执行脚本,脚本调用 一个命令,命令(deamon)是一个守护进程,为了调试,取消了守护进程模式。导致命令后边的其他命令(echo "456")都无法执行。
deamon -d 是以守护进程模式启动;deamon -x 是以非守护进程模式启动(监控进程,死循环),stdout和stderr 关联到 控制终端。
脚本是 a.sh
#!/bin/sh
echo “123“
/usr/local/bin/deamon -d & >/dev/null 2>&1
echo “456”
执行脚本,输出如下:
[root@localhost]#./a.sh
[root@localhost]#123
[root@localhost]#456
[root@localhost]#
符合我的要求,deamon 在后台运行。deamon后面的命令得到运行。
现在我打算把deamon 换成 调试模式 ,deamon -x,输出重定向到 /tmp/debug.info文件
修改a.sh 如下:
#!/bin/sh
echo “123“
/usr/local/bin/deamon -x & >/tmp/debug.info 2>&1
echo “456”
执行脚本,输出如下:
[root@localhost]#./a.sh
[root@localhost]#123
[root@localhost]#deamon的输出信息
这并不是我想要的,deamon的输出没重定向到debug.info文件,并且deamon后边的命令没执行。
经过修改a.sh如下,实现了我的目的。
#!/bin/sh
echo “123“
/usr/local/bin/deamon -x >/tmp/debug.info 2>&1 &
echo “456”
执行后结果是
[root@localhost]#./a.sh
[root@localhost]#123
[root@localhost]#456
[root@localhost]#
deamon的输出信息重定向到/tmp/debug.info文件中。
总结如下:
1.后台符号 &一定要放在整个命令最后。
2.重定向>,>>一定紧跟着重定向文件
3.如果是 文件输出 1 stdout,2 stderr 要重定向到别的文件,也是紧跟>,>>符号。
4.如果想让stderr也跟 stdout一样输出到文件,使用
/usr/local/bin/cmd >file 2>&1
同 /usr/local/bin/cmd 1>file 2>&1 是一样的意思。
补充:
脚本中使用 以下命令关闭0,1,2描述符
exec 0>&-
exec 1>&-
exec 2>&1