linux中nohup 與 & 的區別


Linux/Unix下,通常只有守護進程可在脫離終端的情況下能繼續執行,而普通進程在關閉終端時會因收到SIGHUP信號(掛起信號)而退出。當終端退出后,由該終端啟動的后台程序自動退出。

若想命令在后台運行,則可用 & 指定命令在后台運行;

若想終端退出后程序不停止運行,則可用nohup命令啟動后台程序。

nohup(=no hang up),使命令忽略SIGHUP信號;
[語法] nohup Command [ Arg ... ] [&]
[命令輸出說明]

Command 的輸出如果沒有被重定向,則無論是標准輸出(stdout),還是標准錯誤(stderr),均重定向到nohup.out文件;nohup.out文件缺省寫在當前目錄下,如果在該目錄下無寫權限,則試圖寫到$HOME/nohup.out中,如果仍然失敗,整個命令執行失敗;

Command的輸出如果重定向,則寫入指定的重定向文件中;

[退出狀態]
126 能查找但不能調用 Command 命令;
127 nohup 命令發生錯誤或找不到 Command 命令;
否則為 Command 命令的退出狀態;

nohup與&的區別:
nohup只是讓命令忽略SIGHUP命令而已;

&則讓命令在后台運行;

至於該命令是否能在脫離終端后繼續執行則要看進程是否是守護進程,如果不是,則需要nohup來幫忙;

 

PS,引用 http://www.cnblogs.com/allenblogs/archive/2011/05/19/2051136.html

---------以下為引用內容
————————————————

nohup -- invoke a utility immune to hangups : 運行命令忽略掛起信號

& 是指后台運行;

nohup 的功能和& 之間的功能並不相同。其中,nohup 可以使得命令永遠運行下去和用戶終端沒有關系。當我們斷開ssh 連接的時候不會影響他的運行。而& 表示后台運行。當ssh 斷開連接的時候(用戶退出或掛起的時候),命令也自動退出。

當然我們可以把兩者結合起來使用:

nohup command & 

來實現命令的后台運行並且和用戶終端沒有關系。

由 nohup 文檔來看:

If the output file nohup.out cannot be created in the current directory, the nohup utility uses the directory named by HOME to create the file.

表示:nohup 命令執行后,會產生日志文件,把命令的執行中的消息報損到這個文件之中。如果當前文件不可寫,那么會自動保存到執行這個命令的home 目錄下面。如果是超級管理員root 對應的是/root 目錄。

從上面對比我們發現:

1. & 可以使得命令 免疫 ctrl c 的 SIGINT 信號,不能是的命令對 SIGHUP 信號進行免疫。

2. nohup 可以使得命令對兩個信號都可以進行免疫。

為了使得 & 達到相同的效果:

我們可以使用如下操作:

如果已經使用 & 命令進行 后台運行。

可以使用disown -h 讓任務忽略sighup 信號;

同樣不會因為控制台的終端而中斷任務。

展示:

斷開終端重新登錄時:

這樣當你在大量備份文件的時候,如果出現斷網或者不得不下線的時候。我們可以使用。

ctrl z 掛起任務;disown-h 使得任務 忽略sighup 信號;使用 bg 命令使得命令后台運行。這樣就可以放心得下線了。

參考鏈接:

1. https://blog.csdn.net/zhang_Red/article/details/52789691

2. https://blog.csdn.net/stpeace/article/details/76389073

1.1 nohup

功能:不掛斷運行命令

語法:nohup Command [ Arg … ] [ & ]

​ 無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 文件中。

  如果當前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out 文件中。

  如果沒有文件能創建或打開以用於追加,那么 Command 參數指定的命令不可調用。

退出狀態:該命令返回下列出口值:   

  126: 可以查找但不能調用 Command 參數指定的命令。   

  127: nohup 命令發生錯誤或不能查找由 Command 參數指定的命令。   

  否則,nohup 命令的退出狀態是 Command 參數指定命令的退出狀態。

1.2 &

功能:命令在后台運行,功能與Ctrl+z相同,一般配合nohup一起使用

eg:nohup ~/user/test.sh>output.log 2>&1 &

命令詳解:

  • nohup ~/user/test.sh>output.log 不掛斷運行test.sh,輸出結果重定向到當前目錄的output.log
  • 最后的& 表示后台運行
  • 2>&1 0表示鍵盤輸入,1屏幕輸出即標准輸出,2表示錯誤輸出。其中2>&1表示將錯誤信息重定向到標准輸出 試想一下,如果2>&1指將錯誤信息重定向到標准輸出,那2>1指什么? 分別嘗試2>12>&1
$ ls >outfile
$ cat outlog 
outlog
test.sh $ ls xxx>outfile ls: cannot access xxx: No such file or directory $ cat outfile (這里是空) $ ls xxx 2>1 $ cat 1(可以看出,將錯誤信息重定向到文件1里面了) ls: cannot access xxx: No such file or directory

​ 也就是說2>1會將錯誤信息重定向到文件1里面,所以2>&1中的&1指標准輸出

2. 查看后台運行的進程

2.1 jobs的使用

jobs命令用於顯示Linux中的任務列表及任務狀態,包括后台運行的任務。該命令可以顯示任務號及其對應的進程號。其中,任務號是以普通用戶的角度進行的,而進程號則是從系統管理員的角度來看的。一個任務可以對應於一個或者多個進程號。

語法: jobs(選項)(參數)

選項

-l:顯示進程號; -p:僅任務對應的顯示進程號; -n:顯示任務狀態的變化; -r:僅輸出運行狀態(running)的任務; -s:僅輸出停止狀態(stoped)的任務。

常用命令: jobs -l

其中,輸出信息的第一列表示任務編號,第二列表示任務所對應的進程號,第三列表示任務的運行狀態,第四列表示啟動任務的命令。

缺點:jobs命令只看當前終端生效的,關閉終端后,在另一個終端jobs已經無法看到后台跑得程序了,此時利用ps(進程查看命令)

2.2 ps的使用

ps命令用於報告當前系統的進程狀態。可以搭配kill指令隨時中斷、刪除不必要的程序。ps命令是最基本同時也是非常強大的進程查看命令,使用該命令可以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程占用了過多的資源等等,總之大部分信息都是可以通過執行該命令得到的。

常用命令:ps -aux

a:顯示所有程序 u:以用戶為主的格式來顯示 x:顯示所有程序,不以終端機來區分

通常與nohup &配合使用,用於查看后台進程ID 配合 kill命令殺掉程序

常用命令:ps -aux|grep test.sh| grep -v grep

注:grep -v grep 用grep -v參數可以將grep命令排除掉

https://www.cnblogs.com/laoyeye/p/9346330.html


免責聲明!

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



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