Linux后台執行腳本文件,nohup


看運維人員執行nohup命令后,把程序放在后台執行,很高大上,就研究了一下,這個命令.

nohup命令及其輸出文件

nohup命令:如果你正在運行一個進程,而且你覺得在退出帳戶時該進程還不會結束,那么可以使用nohup命令。該命令可以在你退出帳戶/關閉終端之后繼續運行相應的進程。nohup就是不掛起的意思( n ohang up)。

該命令的一般形式為:nohup command &

  使用nohup命令提交作業

  如果使用nohup命令提交作業,那么在缺省情況下該作業的所有輸出都被重定向到一個名為nohup.out的文件中,除非另外指定了輸出文件:

  nohup command > myout.file 2>&1 &

  在上面的例子中,輸出被重定向到myout.file文件中。

  使用 jobs 查看任務。

例子:

nohup php activity_insert_user.php 61 26_02.txt > 26_02.log 2>&1 &

注意事項:2>&1 是一個整體,中間沒有空格,表示把標准輸出和錯誤輸出都傳到指定文件中.

 下面是詳解:

ls xxx 1>out.txt 2>&1
nohup /mnt/Nand3/H2000G >/dev/null 2>&1 &
對 於& 1 更准確的說應該是文件描述符 1,而1 一般代表的就是STDOUT_FILENO,實際上這個操作就是一個dup2(2)調用.他標准輸出到all_result ,然后復制標准輸出到文件描述符2(STDERR_FILENO),其后果就是文件描述符1和2指向同一個文件表項,也可以說錯誤的輸出被合並了.其中0 表示鍵盤輸入 1表示屏幕輸出 2表示錯誤輸出.把標准出錯重定向到標准輸出,然后扔到/DEV/NULL下面去。通俗的說,就是把所有標准輸出和標准出錯都扔到垃圾桶里面。
command >out.file 2>&1 &
command >out.file是將command的輸出重定向到out.file文件,即輸出內容不打印到屏幕上,而是輸出到out.file文件中。 2>&1 是將標准出錯重定向到標准輸出,這里的標准輸出已經重定向到了out.file文件,即將標准出錯也輸出到out.file文件中。最后一個& , 是讓該命令在后台執行。

試想2>1代表什么,2與>結合代表錯誤重定向,而1則代表錯誤重定向到一個文件1,而不代表標准輸出;
換成2>&1,&與1結合就代表標准輸出了,就變成錯誤重定向到標准輸出.

你可以用
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了。
       為何2>&1要寫在后面?
       command > file 2>&1 
首先是command > file將標准輸出重定向到file中, 2>&1 是標准錯誤拷貝了標准輸出的行為,也就是同樣被重定向到file中,最終結果就是標准輸出和錯誤都被重定向到file中。 
command 2>&1 >file 
2>&1 標准錯誤拷貝了標准輸出的行為,但此時標准輸出還是在終端。>file 后輸出才被重定向到file,但標准錯誤仍然保持在終端。

用strace可以看到: 
1. command > file 2>&1 
這個命令中實現重定向的關鍵系統調用序列是: 
open(file) == 3 
dup2(3,1) 
dup2(1,2) 

2. command 2>&1 >file 
這個命令中實現重定向的關鍵系統調用序列是: 
dup2(1,2) 
open(file) == 3 
dup2(3,1) 

為什么要用 /dev/null 2>&1 這樣的寫法.這條命令的意思是將標准輸出和錯誤輸出全部重定向到/dev/null中,也就是將產生的所有信息丟棄.下面我就為大家來說一下, command > file 2>file   與command > file 2>&1 有什么不同的地方.
首先~command > file 2>file 的意思是將命令所產生的標准輸出信息,和錯誤的輸出信息送到file 中.command   > file 2>file 這樣的寫法,stdout和stderr都直接送到file中, file會被打開兩次,這樣stdout和stderr會互相覆蓋,這樣寫相當使用了FD1和FD2兩個同時去搶占file 的管道.
command >file 2>&1 這條命令就將stdout直接送向file, stderr 繼承了FD1管道后,再被送往file,此時,file 只被打開了一次,也只使用了一個管道FD1,它包括了stdout和stderr的內容.
從IO效率上,前一條命令的效率要比后面一條的命令效率要低,所以在編寫shell腳本的時候,較多的時候我們會用command > file 2>&1 這樣的寫法.

 

參考網址:http://itersky.blog.163.com/blog/static/197177205201262355827645/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM