Linux下使用Shell命令控制程式後台執行

2021-08-15 10:21:49 字數 4494 閱讀 5943

ps 列出系統中正在執行的程序;

kill 傳送訊號給乙個或多個程序(經常用來殺死乙個程序);

jobs 列出當前shell環境中已啟動的任務狀態,若未指定jobsid,則顯示所有活動的任務狀態資訊;如果報告了乙個任務的終止(即任務的狀態被標記為terminated),shell 從當前的shell環境已知的列表中刪除任務的程序標識;

bg 將程序搬到後台執行(background);

fg 將程序搬到前台執行(foreground); 

將job轉移到後台執行 

如果你經常在x圖形下工作,你可能有這樣的經歷:通過終端命令執行乙個gui程式,gui介面出來了,但是你的終端還停留在原地,你不能在shell中繼續執行其他命令了,除非將gui程式關掉。

為了使程式執行後終端還能繼續接受命令,你可以將程序移到後台執行,使用如下命令執行程式: #假設要執行xmms

$xmms &

這樣開啟xmms後,終端的提示又回來了。現在xmms在後台執行著呢;但萬一你執行程式時忘記使用「&」了,又不想重新執行;你可以先使用ctrl+z掛起程式,然後敲入bg命令,這樣程式就在後台繼續執行了。

概念:當前任務 

如果後台的任務號有2個,[1],[2];如果當第乙個後台任務順利執行完畢,第二個後台任務還在執行中時,當前任務便會自動變成後台任務號碼「[2]」的後台任務。所以可以得出一點,即當前任務是會變動的。當使用者輸入「fg」、「bg」和「stop」等命令時,如果不加任何引號,則所變動的均是當前任務。

檢視jobs 

使用jobs或ps命令可以察看正在執行的jobs。 

jobs命令執行的結果,+表示是乙個當前的作業,減號表是是乙個當前作業之後的乙個作業,jobs -l選項可顯示所有任務的pid,jobs的狀態可以是running, stopped, terminated,但是如果任務被終止了(kill),shell 從當前的shell環境已知的列表中刪除任務的程序標識;也就是說,jobs命令顯示的是當前shell環境中所起的後台正在執行或者被掛起的任務資訊;

程序的掛起 

後台程序的掛起: 在solaris中通過stop命令執行,通過jobs命令檢視job號(假設為num),然後執行stop %num;

在redhat中,不存在stop命令,可通過執行命令kill -stop pid,將程序掛起;

當要重新執行當前被掛起的任務時,通過bg %num 即可將掛起的job的狀態由stopped改為running,仍在後台執行;當需要改為在前台執行時,執行命令fg %num即可;

前台程序的掛起:ctrl+z;

程序的終止 

後台程序的終止:

方法一:通過jobs命令檢視job號(假設為num),然後執行kill %num

方法二:通過ps命令檢視job的程序號(pid,假設為pid),然後執行kill pid 

前台程序的終止:  ctrl+c

kill的其他作用 

kill除了可以終止程序,還能給程序傳送其它訊號,使用kill -l 可以察看kill支援的訊號。 

sigterm是不帶引數時kill傳送的訊號,意思是要程序終止執行,但執行與否還得看程序是否支援。如果程序還沒有終止,可以使用kill -sigkill pid,這是由核心來終止程序,程序不能監聽這個訊號。

***************====

/usr/local/mysql/bin/mysqld_safe --user=mysql &

但是我們很多程式並不象mysqld一樣可以做成守護程序,可能我們的程式只是普通程式而已,一般這種程式即使使用 & 結尾,如果終端關閉,那麼程式也會被關閉。為了能夠後台執行,我們需要使用nohup這個命令,比如我們有個start.sh需要在後台執行,並且希望在後台能夠一直執行,那麼就使用nohup:

nohup /root/start.sh &

原程式的的標準輸出被自動改向到當前目錄下的nohup.out檔案,起到了log的作用。

但是有時候在這一步會有問題,當把終端關閉後,程序會自動被關閉,察看nohup.out可以看到在關閉終端瞬間服務自動關閉。

諮詢紅旗linux工程師後,他也不得其解,在我的終端上執行後,他啟動的程序竟然在關閉終端後依然執行。

在第二遍給我演示時,我才發現我和他操作終端時的乙個細節不同:他是在當shell中提示了nohup成功後還需要按終端上鍵盤任意鍵退回到shell輸入命令視窗,然後通過在shell中輸入exit來退出終端;而我是每次在nohup執行成功後直接點關閉程式按鈕關閉終端.。所以這時候會斷掉該命令所對應的session,導致nohup對應的程序被通知需要一起shutdown。

這個細節有人和我一樣沒注意到,所以在這兒記錄一下了。

nohup 命令

用途:不結束通話地執行命令。

語法:nohup command [ arg ... ] [ & ]

描述:nohup 命令執行由 command 引數和任何相關的 arg 引數指定的命令,忽略所有結束通話(sighup)訊號。在登出後使用 nohup 命令執行後台中的程式。要執行後台中的 nohup 命令,新增 & ( 表示"and"的符號)到命令的尾部。

無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 檔案中。如果當前目錄的 nohup.out 檔案不可寫,輸出重定向到 $home/nohup.out 檔案中。如果沒有檔案能建立或開啟以用於追加,那麼 command 引數指定的命令不可呼叫。如果標準錯誤是乙個終端,那麼把指定的命令寫給標準錯誤的所有輸出作為標準輸出重定向到相同的檔案描述符。

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

126 可以查詢但不能呼叫 command 引數指定的命令。

127 nohup 命令發生錯誤或不能查詢由 command 引數指定的命令。

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

nohup命令及其輸出檔案

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

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

使用nohup命令提交作業

如果使用nohup命令提交作業,那麼在預設情況下該作業的所有輸出都被重定向到乙個名為nohup.out的檔案中,除非另外指定了輸出檔案:

nohup command > myout.file 2>&1 &

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

使用 jobs 檢視任務。

使用 fg %n 關閉。

簡單而有用的nohup命令在unix/linux中,普通程序用&符號放到後台執行,如果啟動該程式的控制台logout,則該程序隨即終止。

nohup<程式名>&

則控制台logout後,程序仍然繼續執行,起到守護程序的作用(雖然它不是嚴格意義上的守護程序)。

使用nohup命令後,原程式的的標準輸出被自動改向到當前目錄下的nohup.out檔案,起到了log的作用,實現了完整的守護程序功能。

ygwu @ 2023年04月18日 上午10:03

for example:

如何遠端啟動weblogic服務?

用telnet遠端控**務器,遠端啟動weblogic服務,啟動後關閉telnet,weblogic服務也跟著停止,這是因為使用telnet啟動的程序會隨著telnet程序的關閉而關閉。所以我們可以使用一些unix下的命令來做到不關閉。

使用如下命令:

nohup startweblogic.sh&

如果想要監控標準輸出可以使用:

tail -f nohup.out

當在後台執行了程式的時候,可以用jobs命令來檢視後台作業的狀態。在有多個後台程式時,要使用來引數的fg命令將不同序號的後台作業切換到前台上執行。

當使用者啟動乙個程序的時候,這個程序是執行在前台,使用與相應控制終端相聯絡的標準輸入、輸出進行輸入和輸出。即使將程序的輸入輸出重定向,並將程序放在後台執行,程序仍然和當前終端裝置有關係。正因為如此,在當前的登入會話結束時,控制終端裝置將和登入程序相脫離,那麼系統就向所有與這個終端相聯絡的程序傳送sighup的訊號,通知程序線路已經掛起了,如果程式沒有接管這個訊號的處理,那麼預設的反應是程序結束。因此普通的程式並不能真正脫離登入會話而執行程序,為了使得在系統登入後還可以正常執行,只有使用命令nohup來啟動相應程式。

使用命令nohup當然可以啟動這樣的程式,但nohup啟動的程式在程序執行完畢就退出,而常見的一些服務程序通常永久的執行在後台,不向螢幕輸出結果。在unix中這些永久的後台程序稱為守護程序(daemon)。守護程序通常從系統啟動時自動開始執行,系統關閉時才停止。

在守護程序中,最重要的乙個是超級守護程序inetd,這個程序接管了大部分網路服務,但並不是對每個服務都自己進行處理,而是依據連線請求,啟動不同的服務程式與客戶機打交道。inetd支援網路服務種類在它的設定檔案/etc/inet.conf中定義。inet.conf檔案中的每一行就對應乙個埠位址,當inetd接受到連線這個埠的連線請求時,就啟動相應的程序進行處理。使用inetd的好處是系統不必啟動很多守護程序,從而節約了系統資源,然而使用inetd啟動守護程序相應反應會遲緩一些,不適合用於被密集訪問的服務程序

Linux下的shell命令

linux下的shell命令詳解 注釋 下面出現的file任意 包括檔案字尾 為檔名 dir 為任意檔案目錄名 最後的 可以不要 1 man manual 作用 查詢幫助資訊 用法 man shell命令 man ls man f read 顯示那些手冊中有 read資訊 man 3 read 檢視...

Linux下shell的使用

linux 常見問題1000個詳細解答 1 shell基本引數 cat etc shells 系統提供的shell位置 bsh csh ksh bash 改變root使用者的shell環境 chsh 改變普通使用者的shell環境 more etc passwd 檢視所有使用者的shell環境 2 ...

Linux下Shell的使用

1 shell基本引數 cat etc shells 系統提供的shell位置 bsh csh ksh bash 改變root使用者的shell環境 chsh 改變普通使用者的shell環境 more etc passwd 檢視所有使用者的shell環境 2 shell變數 2.1 環境變數 set...