Linux中如何讓程序在後台執行

2021-09-23 06:31:41 字數 4725 閱讀 3980

一. nohup / setsid / &

使用場景:如果只是臨時有乙個命令需要長時間執行,什麼方法能最簡便的保證它在後台穩定執行呢?

我們的解決辦法就有兩種途徑:要麼讓程序忽略 hup 訊號,要麼讓程序執行在新的會話裡從而成為不屬於此終端的子程序。

解決方法:

1.nohup

只需在要處理的命令前加上 nohup 即可,標準輸出和標準錯誤缺省會被重定向到 nohup.out 檔案中。一般我們可在結尾加上"&"來將命令同時放入後台執行,也可用》filename 2>&1來更改預設的重定向檔名。

[root@pvcent107 ~]# nohup ping www.ibm.com & 

[1] 3059 

to`nohup.

out' 

[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 

[root@pvcent107 ~]# 

2. 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 

[root@pvcent107 ~]# 

上例中我們的程序 id(pid)為31094,而它的父 id(ppid)為1(即為 init 程序 id),並不是當前終端的程序 id。請將此例與nohup 例中的父 id 做比較。

3. &

將乙個或多個命名包含在「()」中就能讓這些命令在子 shell 中執行中 當我們將"&"也放入「()」內之後,我們就會發現所提交的作業並不在作業列表中,也就是說,是無法通過jobs來檢視的。

[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 

[root@pvcent107 ~]# 

新提交的程序的父 id(ppid)為1(init 程序的 pid),並不是當前終端的程序 id。因此並不屬於當前終端的子程序,從而也就不會受到當前終端的 hup 訊號的影響了。

二. disown

使用場景:如果事先在命令前加上 nohup 或者 setsid 就可以避免 hup 訊號的影響。但是如果我們未加任何處理就已經提交了命令,該如何補救才能讓它避免 hup 訊號的影響呢?

解決方法:這時想加 nohup 或者 setsid 已經為時已晚,只能通過作業排程和 disown 來解決這個問題了

當使用過 disown 之後,會將把目標作業從作業列表中移除,我們將不能再使用jobs來檢視它,但是依然能夠用ps -ef查詢到它。

disown 示例1(如果提交命令時已經用「&」將命令放入後台執行,則可以直接使用「disown」)

[root@pvcent107 build]# cp -r testlargefile largefile & 

[1] 4825 

[root@pvcent107 build]# jobs 

[1]+  running                 cp -i -r testlargefile largefile & 

[root@pvcent107 build]# disown -h %1 

[root@pvcent107 build]# ps -ef |grep largefile 

root      4825   968  1 09:46 pts/4    00:00:00 cp -i -r testlargefile largefile 

root      4853   968  0 09:46 pts/4    00:00:00 grep largefile 

[root@pvcent107 build]# logout 

disown 示例2(如果提交命令時未使用「&」將命令放入後台執行,可使用 ctrl-z 和「bg」將其放入後台,再使用「disown」)

[root@pvcent107 build]# cp -r testlargefile largefile2 

[1]+  stopped                 cp -i -r testlargefile largefile2 

[root@pvcent107 build]# bg %1 

[1]+ cp -i -r testlargefile largefile2 & 

[root@pvcent107 build]# jobs 

[1]+  running                 cp -i -r testlargefile largefile2 & 

[root@pvcent107 build]# disown -h %1 

[root@pvcent107 build]# ps -ef |grep largefile2 

root      5790  5577  1 10:04 pts/3    00:00:00 cp -i -r testlargefile largefile2 

root      5824  5577  0 10:05 pts/3    00:00:00 grep largefile2 

[root@pvcent107 build]# 

三: screen

使用場景: 我們已經知道了如何讓程序免受 hup 訊號的影響,但是如果有大量這種命令需要在穩定的後台裡執行,如何避免對每條命令都做這樣的操作呢?

解決方案: 此時最方便的方法就是 screen 了。簡單的說,screen 提供了 ansi/vt100 的終端模擬器,使它能夠在乙個真實終端下執行多個全屏的偽終端。screen 的引數很多,具有很強大的功能,

screen例項

[root@pvcent107 ~]# screen -dms urumchi 

[root@pvcent107 ~]# screen -list 

there is

a screen 

on: 

12842.urumchi   (detached) 

1 socket in

/tmp/screens/s-root. 

[root@pvcent107 ~]# screen -r urumchi 

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

未使用 screen 時新程序的程序樹

[root@pvcent107 ~]# ping www.google.com & 

[1] 9499 

[root@pvcent107 ~]# pstree -h 9499 

init─┬─xvnc 

├─acpid 

├─atd 

├─2*[sendmail]     

├─sshd─┬─sshd───bash───pstree 

│       └─sshd───bash───ping 

未使用 screen 時我們所處的 bash 是 sshd 的子程序,當 ssh 斷開連線時,hup 訊號自然會影響到它下面的所有子程序(包括我們新建立的 ping 程序)。

使用了 screen 後新程序的程序樹

[root@pvcent107 ~]# screen -r urumchi 

[root@pvcent107 ~]# ping www.ibm.com & 

[1] 9488 

[root@pvcent107 ~]# pstree -h 9488 

init─┬─xvnc 

├─acpid 

├─atd 

├─screen───bash───ping 

├─2*[sendmail] 

而使用了 screen 後就不同了,此時 bash 是 screen 的子程序,而 screen 是 init(pid為1)的子程序。那麼當 ssh 斷開連線時,hup 訊號自然不會影響到 screen 下面的子程序了。

Linux中如何讓程序在後台執行

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

Linux中如何讓程序在後台執行

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

Linux中 如何讓程序在後台中執行

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