linux後台執行 掛起 恢復程序相關命令

2021-09-29 18:13:47 字數 2637 閱讀 2745

如果只是臨時有乙個命令需要長時間執行,需要最簡便的保證它在後台穩定執行:

我們知道,當使用者登出(logout)或者網路斷開時,終端會收到 hup(hangup)訊號從而關閉其所有子程序。因此,我們的解決辦法就有兩種途徑:要麼讓程序忽略 hup 訊號,要麼讓程序執行在新的會話裡從而成為不屬於此終端的子程序。

1.nohup

nohup 無疑是我們首先想到的辦法。顧名思義,nohup 的用途就是讓提交的命令忽略 hangup 訊號。nohup 的使用是十分方便的,只需在要處理的命令前加上 nohup 即可,標準輸出和標準錯誤缺省會被重定向到 nohup.out 檔案中。一般我們可在結尾加上"&「來將命令同時放入後台執行,也可用」>filename 2>&1"來更改預設的重定向檔名。

nohup示例

[root@pvcent107 ~]

# nohup ping www.ibm.com &

[1] 3059

[root@pvcent107 ~]

# ps -ef |grep 3059

root 3059 984 0 21:06 pts/3 00:00:00 ping www.ibm.com

root 3067 984 0 21:06 pts/3 00:00:00 grep 3059

2.setid

nohup 無疑能通過忽略 hup 訊號來使我們的程序避免中途被中斷,但如果我們換個角度思考,如果我們的程序不屬於接受 hup 訊號的終端的子程序,那麼自然也就不會受到 hup 訊號的影響了。setsid 就能幫助我們做到這一點。 setsid 的使用也是非常方便的,也只需在要處理的命令前加上 setsid 即可。

setsid 示例

[root@pvcent107 ~]

# setsid ping www.ibm.com

[root@pvcent107 ~]

# ps -ef |grep www.ibm.com

root 31094 1 0 07:28 ? 00:00:00 ping www.ibm.com

root 31102 29217 0 07:29 pts/4 00:00:00 grep www.ibm.com

3.&

這裡還有乙個關於 subshell 的小技巧。我們知道,將乙個或多個命名包含在「()」中就能讓這些命令在子 shell 中執行中,從而擴充套件出很多有趣的功能,我們現在要討論的就是其中之一。

當我們將"&"也放入「()」內之後,我們就會發現所提交的作業並不在作業列表中,也就是說,是無法通過jobs來檢視的。

subshell示例

[root@pvcent107 ~]

# (ping www.ibm.com &)

[root@pvcent107 ~]

# ps -ef |grep www.ibm.com

root 16270 1 0 14:13 pts/4 00:00:00 ping www.ibm.com

root 16278 15362 0 14:13 pts/4 00:00:00 grep www.ibm.com

如果有大量命令需要在穩定的後台裡執行,此時最方便的方法就是 screen 了。簡單的說,screen 提供了 ansi/vt100 的終端模擬器,使它能夠在乙個真實終端下執行多個全屏的偽終端。screen 的引數很多,具有很強大的功能,我們在此僅介紹其常用功能以及簡要分析一下為什麼使用 screen 能夠避免 hup 訊號的影響。

使用 screen 很方便,有以下幾個常用選項:

screen 示例

[root@pvcent107 ~]

# screen -dms urumchi

[root@pvcent107 ~]

# screen -list

there is a screen on:

12842.urumchi (detached)

1 socket i

[root@pvcent107 ~]

# screen -r urumchi

當我們用「-r」連線到 screen 會話後,我們就可以在這個偽終端裡面為所欲為,再也不用擔心 hup 訊號會對我們的程序造成影響,也不用給每個命令前都加上「nohup」或者「setsid」了。

可以將乙個正在前台執行的命令放到後台,並且處於暫停狀態。

檢視當前有多少在後台執行的命令

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

Linux 的程序掛起和恢復

程序的掛起及恢復 ctrl z 掛起,程式放到後台,程式沒有結束。jobs 檢視被掛起的程式工作號 恢復程序執行時,有兩種選擇 fg命令將掛起的作業放回到前台執行 用bg命令將掛起的作業放到後台執行 格式 fg 工作號 bg 工作號 程序 正在執行的乙個程式 程式 是一種寫好的 或指令碼 後台執行,...

Linux程序後台執行

學習snmp協議,寫了乙個用sysuptime.0獲取系統自開機到現在的時間的小php程式,如下 define bit 8 g 0 idd mysql connect localhost n1417 123456 or die could not connect mysql error mysql ...

程序在Linux後台執行

在linux中,如果要讓程序在後台執行,一般情況下,我們在命令後面加上 即可,實際上,這樣是將命令放入到乙個作業佇列中了 test.sh 1 17208 jobs l 1 17208 running test.sh 對於已經在前台執行的命令,也可以重新放到後台執行,首先按ctrl z暫停已經執行的程...