linux進程掛起
背景 :工作需要,需要遠程式控制制主機使其斷開Xshell後也能一直運行。
關鍵字 :& ,nohup,腳本掛起。
在應用Unix/Linux時,我們一般想讓某個程序在後台運行,於是我們將常會用 & 在程序結尾來讓程序自動運行。
鍵入Ctrl + C,發出SIGINT信號,程序會繼續運行
方法一、輸入命令:jobs
方法二:輸入命令:ps
fg、bg、jobs、&、nohup、ctrl+z、ctrl+c 命令
加在一個命令的最後,可以把這個命令放到後台執行,如
可以將一個正在前台執行的命令放到後台,並且處於暫停狀態。
查看當前有多少在後台運行的命令
jobs -l選項可顯示所有任務的PID,jobs的狀態可以是running, stopped, Terminated。但是如果任務被終止了(kill),shell 從當前的shell環境已知的列表中刪除任務的進程標識。
將後台中的命令調至前台繼續運行。如果後台中有多個命令,可以用fg %jobnumber(是命令編號,不是進程號)將選中的命令調出。
將一個在後台暫停的命令,變成在後台繼續執行。如果後台中有多個命令,可以用bg %jobnumber將選中的命令調出。
法子1:通過jobs命令查看job號(假設為num),然後執行kill %num
法子2:通過ps命令查看job的進程號(PID,假設為pid),然後執行kill pid
前台進程的終止:Ctrl+c
如果讓程序始終在後台執行,即使關閉當前的終端也執行(之前的&做不到),這時候需要nohup。該命令可以在你退出帳戶/關閉終端之後繼續運行相應的進程。
關閉中斷後,在另一個終端jobs已經無法看到後台跑得程序了,此時利用ps(進程查看命令)
如上所示:
nohup 和 & 組合了後台運行程序。
可以輸出到 out.log保存程序輸出,也可以輸出到/dev/null 即空設備,不保存輸出。
上面三種方式無論在nohup.out 或test.out都看不到數據結果,這是因為python執行有緩存輸出
解決
新的介面接入查看程序
使用&後台運行程序:
結果會輸出到終端
使用Ctrl + C發送SIGINT信號, 程序免疫
關閉session發送SIGHUP信號, 程序關閉
使用nohup運行程序:
結果默認會輸出到nohup.out
使用Ctrl + C發送SIGINT信號, 程序關閉
關閉session發送SIGHUP信號, 程序免疫
平日線上經常使用nohup和&配合來啟動程序:
同時免疫SIGINT和SIGHUP信號
同時,還有一個最佳實踐:
不要將信息輸出到終端標准輸出,標准錯誤輸出,而要用日誌組件將信息記錄到日誌里
nohup和&究竟有啥區別
Ⅱ linux如何掛起某個進程,然後再恢復
kill命令帶-s參數用來向進程發送信號(SIG),可以用kill -l來查看信號說明。
Ⅲ linux中顯示進程被掛起sleep. 會佔用內存嗎
會,掛起也會被佔用內存的,你想想,這好比就是在windows下,用視頻播放器打開一個視頻暫停住是一個道理。
Ⅳ Linux中進程的阻塞和掛起的區別
掛起就是暫停,有需要的時候在執行
後台執行就是繼續執行功能,但是不做交互了;
假設掛起web服務程序,他就不提供web訪問服務了;
後台執行web伺服器還是提供web訪問服務的,有些版本的系統,前台和後台執行佔用的資源優先順序由點區別;
你說這個有什麼相同之處呢?
Ⅳ linux 掛起進程
樓上的回答很好,答案就是這個:nohup xclock &
我來解釋下: 命令後帶上 & 就是進入後台執行的意思
那麼為什麼要 nohup呢,因為如果終端關閉,這個xclock程序也會關閉,用是為了不會掛斷
另外你提到的掛起,我想應該是指 ctrl+z,這個是暫停程序放到後台,就是掛起的意思,然後可以用fg和bg前後台切換。
Ⅵ linux 進程的幾種狀態
Linux內核中定義了以下幾種狀態:
#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define TASK_ZOMBIE 4
#define TASK_STOPPED 8
其中:
TASK_RUNNING是就緒態,進程當前只等待CPU資源。
TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE都是阻塞態,進程當前正在等待除CPU外的其他系統資源;前者可以被信號喚醒,後者不可以。
TASK_ZOMBIE是僵屍態,進程已經結束運行,但是進程式控制制塊尚未注銷。
TASK_STOPPED是掛起狀態,主要用於調試目的。進程接收到SIGSTOP信號後會進入該狀態,在接收到SIGCONT後又會恢復運行。
Ⅶ linux掛起是什麼意思
掛載就是把硬碟設備連接到某個目錄下。比如mount -t vfat -o utf8 /dev/sda1 /mnt/winC,就是把/dev/sda1這個分區(我的機器上對應的是win下的C盤)掛載到/mnt/winC下。目錄可以自行創建,好記就行。掛載以後對目錄的操作就是對相應分區的操作。目錄的內容變成相應分區下的內容。而原來的內容就看不見了(被隱藏起來了,並沒有刪除),卸載(比如:umount /mnt/winXC)之後原來的內容就又回來了。
Ⅷ linux c語言怎樣掛起線程/進程
線程
可以用pthread_kill函數
傳遞信號SIGSTOP掛起
傳遞SIGCONT 恢復
進程
調用系統的stop掛起
或者用kill -stop 掛起
類似的 用SIGCONT 恢復。
Ⅸ 【轉載】進程的掛起
原文鏈接: https://blog.csdn.net/freeelinux/java/article/details/53562592
通常我們所認為的進程有五大狀態, 新建態,就緒態,阻塞態,運行態,退出態 。
下面是示意圖:
事實上還存在被掛起的進程。
交換的需要 前面圖中三個基本狀態(就緒態、運行態和阻塞態)提供了一種為進程行為建立模型的系統方法,並指導操作系統的實現。
但是,可以證明往模型中增加其他狀態也是合理的。下面考慮一個沒有使用虛擬內存的系統,每次執行中的進程必須完全載入內存。因此,所有隊列中的所有進程必須駐留在內存中。
內存保存多個進程,當一個進程正在等待是,處理器可以轉移到另一個進程,但是CPU比I/O要快的多,以至於內存中所有進程都在等待I/O的情況很常見。因此,即使是多道程序設計,大多數時候處理器仍然可能處於空閑狀態。
一種解決辦法是擴充內存適應更多的進程。有以下缺點:1.內存的價格 2.程序對內存空間需求的增長速度比內存價格下降的速度快。因此,更大的內存往往導致更大的進程,而不是更多的進程。
另一種解決方案是交換。包括把內存中某個進程的一部分或全部移到磁碟中。當內存中沒有處於就緒狀態的進程時,操作系統就把被阻塞的進程患處到磁碟中的」掛起隊列「(suspend queue),即暫時保存從內存中」驅逐「出來的被掛器的進程隊列。操作系統再次之後取出掛起隊列中的另一個進程,或者接受一個新進程的請求,將其納入內存運行。
「交換」(swapping)是一個I/O操作,因而可能使問題更惡化。但是由於磁碟I/O一般是系統中最快的I/O(相對於磁帶或者列印機I/O),所以交換通常會提高性能。
現在有兩種進程模型,一種是包含單掛起態的模型,一種是包含兩個掛起態的模型。
分別如圖:
包含兩個掛起態的模型如圖:
與之前五個轉換模型相比,比較重要的新轉換如下:
阻塞->阻塞/掛起 :如果沒有就緒進程,則至少一個阻塞進程被換出,為另一個沒有阻塞的進程讓出空間。如果操作系統確定當前正在運行的進程,或者就緒進程為了維護基本的性能要求而需要更多的內存空間,那麼,即使有可用的就緒態進程也可能出現這種轉換。
阻塞掛起->就緒掛起 :如果等待的事件發生了,則處於阻塞/掛起狀態的進程可轉換到就緒/掛起態。注意,這要求操作系統必須能夠得到掛起進程的狀態信息。
就緒/掛起->就緒 :如果內存中沒有就緒態進程,操作系統需要調入一個進程繼續執行。此外,當處於就緒/掛起狀態的進程比處於就緒態的任何進程的優先順序都要高時,也可以進行這種轉換。這種情況的產生是由於操作系統設計者規定,調入高優先順序的進程比減少交換量更重要。
就緒->就緒/掛起 :通常,操作系統更傾向於掛起阻塞態進程而不是就緒態進程,因為就緒態進程可以立即執行,而阻塞態進程佔用了內存空間但不能執行。但如果釋放內存以得到足夠空間的唯一方法是掛起一個就緒態進程,那麼這種轉換也是必需的。並且,如果操作系統確信高優先順序的阻塞態進程很快就會就緒,那麼它可能選擇掛起一個低優先順序的就緒態進程,而不是一個高優先順序的阻塞態進程。
通俗的說,就是掛起不掛起,不光要考慮為進程讓出空間,不光要考慮是否就緒,還要考慮進程的優先順序。
還需要考慮的幾種其他轉換有:
新建->就緒掛起及新建->就緒 :當創建一個新進程時,該進程或者加入就緒隊列,或者加入就緒/掛起隊列。不論哪種情況,操作系統都必須建立一些表管理進程,並為進程分配地址空間。操作系統可能更傾向於在初期執行這些輔助工作,這使得它可以維護大量的未阻塞的進程。通過這一策略,內存中經常會沒有足夠的足夠的空間分配給新進程。因此使用了(新建->就緒/掛起)轉換。另一方面,我們可以證明創建進程時適時(just-in-time)原理,即盡可能推遲創建進程以減少操作系統的開銷,並在系統被阻塞態進程阻塞時允許操作系統執行進程創建任務。
阻塞/掛起->阻塞 :這種轉化在設計中比較少見,如果一個進程沒有準備好執行,並且不在內存中,調入它又有什麼意義?但是考慮到下面的情況:一個進程終止,釋放了一些內存空間,阻塞/掛起隊列中有一個進程優先順序比就緒/掛起隊列中任何進程的優先順序都要高,並且操作系統有理由相信阻塞進程的事件很快就會發射管,這時,把阻塞進程而不是就緒進程調入內存是合理的。
運行->就緒/掛起 :通常當分配給一個運行進程的時間期滿時,它將轉換到就緒態。但是,如果由於位於阻塞/掛起隊列中具有較高優先順序的進程變得不再被阻塞,操作系統搶占這個進程,也可以直接把這個運行進程轉換到就緒/掛起隊列中,並釋放一些內存空間。
各種狀態/退出 :在典型情況下,一個進程在運行時終止,或者是因為它已經完成,或者是因為出現了一些錯誤條件。但是,在某些操作系統中,一個進程可以被創建它的進程終止,或者當父進程終止時終止。如果允許這樣,則進程在任何狀態時都可以轉換到退出態。
掛起的其他用途 :到目前為止,掛起進程的概念與不在內存中的進程概念是等價的。一個不再內存中的進程,不論是否在等待一個事件,都不能立即執行。
總結一下掛起進程的概念:
1.進程不能立即執行
2.進程可能是或不是正在等待一個事件。如果是,阻塞條件不依賴於掛起條件,阻塞事件的發生不會使進程立即被執行。
3.為阻止進程執行,可以通過代理把這個進程置於掛起狀態,代理可以是進程自己,也可以是父進程或操作系統。
4.除非代理顯示地命令系統進行狀態轉換,否則進程無法從這個狀態中轉移。
下面一張表展示掛起進程的原因:
好,暫時就到這里了。
Ⅹ linux掛起按什麼喚醒
命令運行時使用CTRL+Z,強制當前進程轉為後台,並使之掛起(暫停).
1. 使進程恢復運行(後台)
(1)使用命令bg
Example:
zuii@zuii-desktop:~/unp/tcpcliserv$ ./tcpserv01
*這里使用CTRL+Z,此時serv01是停止狀態*
[1]+ Stopped ./tcpserv01
zuii@zuii-desktop:~/unp/tcpcliserv$ bg
[1]+ ./tcpserv01 & *此時serv01運行在後台*
zuii@zuii-desktop:~/unp/tcpcliserv$
(2)如果用CTRL+Z停止了幾個程序呢?
Example:
zuii@zuii-desktop:~/unp/tcpcliserv$ jobs
[1]- Running ./tcpserv01 &
[2]+ Stopped ./tcpcli01 127.0.0.1
zuii@zuii-desktop:~/unp/tcpcliserv$ bg %1
bash: bg:任務 1 已轉入後台 *後台運行*
2. 使進程恢復至前台運行
Example:
zuii@zuii-desktop:~/unp/tcpcliserv$ ./tcpserv04
[1]+ Stopped ./tcpserv04
zuii@zuii-desktop:~/unp/tcpcliserv$ fg
./tcpserv04
總結:
(1) CTRL+Z掛起進程並放入後台
(2) jobs 顯示當前暫停的進程
(3) bg %N 使第N個任務在後台運行(%前有空格)
(4) fg %N 使第N個任務在前台運行
默認bg,fg不帶%N時表示對最後一個進程操作!