1. 程式人生 > 實用技巧 >nohup命令重定向標準輸出和錯誤輸出

nohup命令重定向標準輸出和錯誤輸出

命令:command > /dev/null 2>&1 &

輸出到/dev/null表示輸出重定向到黑洞,即輸出內容不列印到螢幕上,null是/dev下空裝置檔案。

>:代表重定向到哪裡,例如:echo "123" > ./123.txt
1:表示stdout標準輸出,系統預設值是1,所以">/dev/null"等同於"1>/dev/null"
2:表示stderr標準錯誤
&:表示等同於的意思,2>&1,表示2的輸出重定向等同於1

[root@guangzhou study]# cat print.php
<?php
echo "hello,world\";

一. 依據上面所述,下面兩種輸出效果一致:

[root@guangzhou study]# php print.php > print.log
[root@guangzhou study]# php print.php 1> print1.log
[root@guangzhou study]# cat print.log
hello,world.
[root@guangzhou study]# cat print1.log
hello,world.

二. 現在嘗試標準錯誤輸出,故意修改造成print.php檔案報語法錯誤,執行程式碼後列印兩個日誌檔案均為空。

[root@guangzhou study]# cat
print.php <?php //echo "hello,world.\n"; aaa "hello,world.\n"; [root@guangzhou study]# php print.php 1> print1.log PHP Parse error: syntax error, unexpected '"hello,world.\n"' (T_CONSTANT_ENCAPSED_STRING) in /opt/www/study/print.php on line 3 [root@guangzhou study]# php print.php > print.log PHP Parse error: syntax error, unexpected
'"hello,world.\n"' (T_CONSTANT_ENCAPSED_STRING) in /opt/www/study/print.php on line 3 [root@guangzhou study]# cat print.log [root@guangzhou study]# cat print1.log

可見標準輸出不能程式的錯誤輸出。

現在改成2使用錯誤輸出重定向錯誤日誌,執行程式後列印可見錯誤資訊。

[root@guangzhou study]# php print.php 2> print2.log
[root@guangzhou study]# cat print2.log
PHP Parse error:  syntax error, unexpected '"hello,world.\n"' (T_CONSTANT_ENCAPSED_STRING) in /opt/www/study/print.php on line 3

現在我們知道標準輸出和錯誤輸出各自使用場景。(注意: 重定向符號“>”前的數字1/2中間必須在一起,中間不能有空格,不然重定向失敗。)

另外可以將錯誤輸出重定向到標準輸出的日誌檔案中:

[root@guangzhou study]# cat print.php
<?php
//echo "hello,world.\n";
aaa "hello,world.\n";
[root@guangzhou study]# php print.php > print.log 2>&1[root@guangzhou study]# cat print.php
<?php
echo "hello,world.\n";
[root@guangzhou study]# php print.php > print2.log 2>&1
[root@guangzhou study]# cat print.log
PHP Parse error:  syntax error, unexpected '"hello,world.\n"' (T_CONSTANT_ENCAPSED_STRING) in /opt/www/study/print.php on line 3
[root@guangzhou study]# cat print2.log
hello,world.

完整命令: command > 日誌檔案 2>&1

三. 有時程式可能要跑好一會,當前命令列視窗需要處理其他事情的情況下,可以在命令末尾加上“&”符號,下面指令碼一開始休眠10秒鐘:

[root@guangzhou swoole_study]# cat print.php
<?php
sleep(10);
echo "hello,world.\n";
[root@guangzhou swoole_study]# php print.php > print.log 2>&1 &
[2] 11641
#當前視窗可執行其他命令,如date命令
[root@guangzhou swoole_study]# date
2020年 09月 23日 星期三 10:52:38 CST
[root@guangzhou swoole_study]# cat print.log
hello,world.
[2]-  完成                  php print.php > print.log 2>&1

四. 上面命令末尾加“&”符號只能用在視窗為關閉的情況,如需要關閉視窗後命令繼續執行的可在命令開始處加上“nohup”符號:

[root@guangzhou swoole_study]# cat print.php
<?php
echo date('Y-m-d H:i:s') . "\n";
sleep(50);
echo "hello,world.\n";
echo date('Y-m-d H:i:s') . "\n";
[root@guangzhou swoole_study]# date
2020年 09月 23日 星期三 11:06:25 CST
[root@guangzhou swoole_study]# nohup php print.php > print.log 2>&1 &
[1] 14164
[root@guangzhou swoole_study]# date
2020年 09月 23日 星期三 11:06:32 CST

第二個date執行後立即關閉當前視窗,並新開視窗列印日誌,可見兩次時間不足50秒:

[root@guangzhou study]# cat print.log
nohup: 忽略輸入
2020-09-23 03:02:59
hello,world.
2020-09-23 03:03:12

這裡有一點忘記說明,關閉視窗前需要執行exit,直接關閉視窗會導致nohup命令無法掛起。

我們重新跑一次 cat.php, date, nohup php print.php > print.log 2>&1 &, date, 再加上exit命令,關閉當前視窗並新開視窗,列印print.log檔案可以發現時間間隔正好是50秒。

ps: nohup命令是由 Command引數和任何相關的 Arg引數指定的命令,忽略所有結束通話SIGHUP訊號。
如果不將 nohup 命令的輸出重定向,輸出將附加到當前目錄的 nohup.out檔案中。如果當前目錄的 nohup.out 檔案不可寫,輸出重定向到 $HOME/nohup.out 檔案中。