日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

【OS】Linux命令如何放到后台运行

發(fā)布時間:2025/6/15 linux 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【OS】Linux命令如何放到后台运行 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【OS】Linux命令如何放到后臺運行

linux命令后臺運行

???有兩種方式:


? ?1. command & : 后臺運行,你關掉終端會停止運行 ? ?2. nohup command & : 后臺運行,你關掉終端也會繼續(xù)運行


???


一、 簡介? ? ? Linux/Unix 區(qū)別于微軟平臺最大的優(yōu)點就是真正的多用戶,多任務。因此在任務管理上也有別具特色的管理思想。 我們知道,在 Windows 上面,我們要么讓一個程序作為服務在后臺一直運行,要么停止這個服務。而不能讓程序在前臺后臺之間切換。而 Linux 提供了 fg 和bg 命令,讓你輕松調(diào)度正在運行的任務。假設你發(fā)現(xiàn)前臺運行的一個程序需要很長的時間,但是需要干其他的事情,你就可以用 Ctrl-Z ,掛起這個程序,然后可以看到系統(tǒng)提示: [1]+ Stopped /root/bin/rsync.sh 然后我們可以把程序調(diào)度到后臺執(zhí)行:(bg 后面的數(shù)字為作業(yè)號) #bg 1 [1]+ /root/bin/rsync.sh & 用 jobs 命令查看正在運行的任務: #jobs [1]+ Running /root/bin/rsync.sh & 如果想把它調(diào)回到前臺運行,可以用 #fg 1 /root/bin/rsync.sh 這樣,你在控制臺上就只能等待這個任務完成了。



&?將指令丟到后臺中去執(zhí)行 [ctrl]+z?將前臺任務丟到后臺中暫停 jobs?查看后臺的工作狀態(tài) fg %jobnumber?將后臺的任務拿到前臺來處理 bg %jobnumber?將任務放到后臺中去處理 kill?管理后臺的任務


二、&

在Linux中,當在前臺運行某個作業(yè)時,終端被該作業(yè)占據(jù);而在后臺運行作業(yè)時,它不會占據(jù)終端。可以使用&命令把作業(yè)放到后臺執(zhí)行。實際上,這樣是將命令放入到一個作業(yè)隊列中了:


$ ./test.sh & [1] 17208



$ jobs -l [1]+ 17208 Running???????????????? ./test.sh & ? ? 在后臺運行作業(yè)時要當心:需要用戶交互的命令不要放在后臺執(zhí)行,因為這樣你的機器就會在那里傻等。不過,作業(yè)在后臺運行一樣會將結(jié)果輸出到屏幕上,干擾你的工作。如果放在后臺運行的作業(yè)會產(chǎn)生大量的輸出,最好使用下面的方法把它的輸出重定向到某個文件中: command >out.file 2>&1 & 在上面的例子中,2>&1表示所有的標準輸出和錯誤輸出都將被重定向到一個叫做out.file 的文件中。 當你成功地提交進程以后,就會顯示出一個進程號,可以用它來監(jiān)控該進程,或殺死它。? 例:查找名為“httpd.conf”的文件,并把所有標準輸出和錯誤輸出重定向到find.dt的文件中:? # find /etc/httpd/ -name "httpd.conf" -print >find.dt 2>&1 &? [2] 7832? 成功提交該命令之后,系統(tǒng)給出了它的進程號7832。 對于已經(jīng)在前臺執(zhí)行的命令,也可以重新放到后臺執(zhí)行,首先按ctrl+z暫停已經(jīng)運行的進程,然后使用bg命令將停止的作業(yè)放到后臺運行,例如對正在前臺執(zhí)行的tesh.sh使用ctrl+z掛起它: $ ./test.sh [1]+ Stopped???????????????? ./test.sh



$ bg %1 [1]+ ./test.sh &



$ jobs -l [1]+ 22794 Running???????????????? ./test.sh &


但是如上方到后臺執(zhí)行的進程,其父進程還是當前終端shell的進程,而一旦父進程退出,則會發(fā)送hangup信號給所有子進程,子進程收到hangup以后也會退出。如果我們要在退出shell的時候繼續(xù)運行進程,則需要使用nohup忽略hangup信號,或者setsid將將父進程設為init進程(進程號為1)


$ echo $$ 21734



$ nohup ./test.sh & [1] 29016



$ ps -ef | grep test 515????? 29710 21734 0 11:47 pts/12?? 00:00:00 /bin/sh ./test.sh 515????? 29713 21734 0 11:47 pts/12?? 00:00:00 grep test $ setsid ./test.sh & [1] 409



$ ps -ef | grep test 515??????? 410???? 1 0 11:49 ???????? 00:00:00 /bin/sh ./test.sh 515??????? 413 21734 0 11:49 pts/12?? 00:00:00 grep test 上面的試驗演示了使用nohup/setsid加上&使進程在后臺運行,同時不受當前shell退出的影響。那么對于已經(jīng)在后臺運行的進程,該怎么辦呢?可以使用disown命令:



$ ./test.sh & [1] 2539



$ jobs -l [1]+ 2539 Running???????????????? ./test.sh &


$ disown -h %1


$ ps -ef | grep test 515??????? 410???? 1 0 11:49 ???????? 00:00:00 /bin/sh ./test.sh 515?????? 2542 21734 0 11:52 pts/12?? 00:00:00 grep test 另外還有一種方法,即使將進程在一個subshell中執(zhí)行,其實這和setsid異曲同工。方法很簡單,將命令用括號() 括起來即可:


$ (./test.sh &)


$ ps -ef | grep test 515??????? 410???? 1 0 11:49 ???????? 00:00:00 /bin/sh ./test.sh 515????? 12483 21734 0 11:59 pts/12?? 00:00:00 grep test 注:本文試驗環(huán)境為Red Hat Enterprise Linux AS release 4 (Nahant Update 5),shell為/bin/bash,不同的OS和shell可能命令有些不一樣。例如AIX的ksh,沒有disown,但是可以使用nohup -p PID來獲得disown同樣的效果。


還有一種更加強大的方式是使用screen,首先創(chuàng)建一個斷開模式的虛擬終端,然后用-r選項重新連接這個虛擬終端,在其中執(zhí)行的任何命令,都能達到nohup的效果,這在有多個命令需要在后臺連續(xù)執(zhí)行的時候比較方便:

$ screen -dmS screen_test


$ screen -list There is a screen on: ? ? ? ? 27963.screen_test?????? (Detached) 1 Socket in /tmp/uscreens/S-jiangfeng.


$ screen -r screen_test


三、 nohup? ? ? 如果你正在運行一個進程,而且你覺得在退出帳戶時該進程還不會結(jié)束,那么可以使用nohup命令。該命令可以在你退出帳戶之后繼續(xù)運行相應的進程。nohup就是不掛起的意思( no hang up)。 該命令的一般形式為:? nohup conmmand & 如果使用nohup命令提交作業(yè),那么在缺省情況下該作業(yè)的所有輸出都被重定向到一個名為nohup.out的文件中,除非另外指定了輸出文件: nohup command > myout.file 2>&1? 在上面的例子中,輸出被重定向到myout.file文件中。




四、.*,?,[...],[!...]等? 下面就是這些特殊字符:? * 匹配文件名中的任何字符串,包括空字符串。? ? 匹配文件名中的任何單個字符。? [...] 匹配[ ]中所包含的任何字符。? [!...] 匹配[ ]中非感嘆號!之后的字符。? 當s h e l l遇到上述字符時,就會把它們當作特殊字符,而不是文件名中的普通字符,這樣用戶就可以用它們來匹配相應的文件名。
1)列出以i或o開頭的文件名:???? #ls [io]* 2)列出log.開頭、后面跟隨一個數(shù)字、然后可以是任意字符串的文件名: #ls log.[0-9]*? 3)與例二相反,列出log.開頭、后面不跟隨一個數(shù)字、然后可以是任意字符串的文件名 : #ls log.[!0-9]*? 4)列出所有以LPS開頭、中間可以是任何兩個字符,最后以1結(jié)尾的文件名:#ls LPS??1 5)列出所有以大寫字母開頭的文件名:$ ls [A-Z]* 6)列出所有以. 開頭的文件名(隱含文件,例如. profile、.rhosts、.histo ry等): $ ls .*


  • 其他相關命令:


jobs:查看當前有多少在后臺運行的命令 fg:將后臺中的命令調(diào)至前臺繼續(xù)運行。如果后臺中有多個命令,可以用 fg %jobnumber將選中的命令調(diào)出,%jobnumber是通過jobs命令查到的后臺正在執(zhí)行的命令的序號(不是pid) bg:將一個在后臺暫停的命令,變成繼續(xù)執(zhí)行。如果后臺中有多個命令,可以用bg %jobnumber將選中的命令調(diào)出,%jobnumber是通過jobs命令查到的后臺正在執(zhí)行的命令的序號(不是pid)


  • 殺死進程

殺死已經(jīng)啟動的程序和普通方式一樣:

  • pkill -9?name
  • killall?name
  • kill?pid



執(zhí)行背景工作的指令

指令或符號

使用範例

說明

& % fasta & 在背景中執(zhí)行程式
jobs % jobs 顯示送入背景之工作
kill % kill (job#) 移除指定之批次工作
ctrl-z ? 暫停前景中執(zhí)行之程式
bg % bg 將暫停之工作送入背景執(zhí)行
fg % fg 將背景之工作拉回前景執(zhí)行



1.通過使用‘&’操作符讓Job在后臺運行
通常我們Linux的終端中,運行某一命令時,終端總是等待某一特定的命令或程序運行完以后,給出一個提示,然后我們才能繼續(xù)運行下一個命令。如果我們要運行一個比較耗時的命令,但是在該命令運行的同時還需要做另外的一些事,那該怎么辦呢?
你可以通過在命令的后面加上一個‘&’操作符,來讓一個任務在后臺運行。(當然如果你是用GUI界面,你也可以重新打開一個窗口運行新的命令或程序)
例如,我們需要拷貝一個比較大的文件,在拷貝的同時,還要做其他一些事情,那么在拷貝命令后面加上一個‘&’,讓它在后臺拷貝:
lennon@lennon-laptop:~$?cp /media/bigfile /home/lennon/Downloads/ &
[1] 3526
lennon@lennon-laptop:~$?
此時,我們可以看到在終端中,執(zhí)行了某一命令后,給出了一些信息,然后就返回了,接著提示用戶可以出入下一個命令了,這樣程序或命令就在后臺執(zhí)行了。
在顯示的信息中,用方括號括起來的數(shù)字,表示系統(tǒng)分配給這個Job的Job Number,這里'[1]'中的1,就是這個Job的Job Number。而后面一個比較大的數(shù)字,則是系統(tǒng)分配的進程ID(PID),這個PID在系統(tǒng)就代表這個進程。
在后臺運行的job,當其運行完成以后,且輸入回車后,會在終端中給出一個提示:
lennon@lennon-laptop:~$ rm Downloads/linux_11gR2_database_1of2.zip &
[1] 3666
lennon@lennon-laptop:~$?
[1]+? Done??????????????????? rm Downloads/linux_11gR2_database_1of2.zip

2.使用jobs命令,來查看當前系統(tǒng)中的Job
如果我們需要查看當前系統(tǒng)中,有那些job,使用‘jobs’命令:
lennon@lennon-laptop:~$?jobs
[1]-? Running???????????????? cp /media/bigfile /home/lennon/Downloads/ &
[2]+? Stopped???????????????? cat
lennon@lennon-laptop:~$?
如此時,顯示我的系統(tǒng)中有2個job,一個是剛才的正在運行的拷貝命令([1]標識),一個是停止運行的cat命令([2]表示)。這里‘Running’、‘Stopped’表示任務的狀態(tài)。

jobs命令參考
命令名稱:jobs
使用權限:所有權限
命令描述:列出系統(tǒng)中的job。注意:不是所有的shell都能使用此命令
語法:jobs [-p | -l] [-n] [-p] [-x] [job id]
參數(shù):
-p | -l : Report the process group ID and working directory of the jobs.
-n????? : Display only jobs that have stopped or exited since last notified.
-p????? : Displays only the process IDs for the process group leaders of the selected jobs.
-x????? : Replace any job_id found in command or arguments with the corresponding?
?????????? process group ID, and then execute command passing it arguments.
job id? : The job id.

3.Suspend key 和 bg命令的使用(將一個正在運行的job放到后臺運行)
如果你在運行job前,并不知道該job的運行情況,但在job運行了以后,發(fā)現(xiàn)這個是耗時的任務,并想將其放入到后臺運行,這樣你可以在這個任務運行的同時,完成一些其他的事情,那么你可以這樣做:
使用掛起鍵(Suspend Key,通常是Ctrl-Z)將該任務掛起(也就是暫停),然后使用‘bg’命令在后臺讓該job恢復執(zhí)行。
lennon@lennon-laptop:~$?cp bigfile bigfile.bac
^Z
[1]+? Stopped???????????????? cp bigfile bigfile.bac
lennon@lennon-laptop:~$?bg %1
[1]+ cp bigfile bigfile.bac &
lennon@lennon-laptop:~$
使用Ctrl-Z后,系統(tǒng)會將當前正在運行的job暫停,將其移至后臺,給出用戶改任務的提示(包括job number、狀態(tài)、job),然后提示用戶輸入下一個命令。
在job掛起后,可以使用‘bg’命令,讓job恢復到剛才中斷的地方繼續(xù)運行并將其放到后臺運行。使用‘bg %job number’來指定你需要對哪一個job進行操作,這里‘%’告訴系統(tǒng)后面的數(shù)字是一個job number(不要‘%’可能也可以)。當然在系統(tǒng)中只有一個job的時候,你也可以忽略改參數(shù)。

bg命令參考:
命令名稱:bg
使用權限:所有權限
命令描述:在后臺恢復已停止的job繼續(xù)運行。注意該命令不能在所有的Unix的shell下運行
語法:bg [-l] [-p] [-x] [job]
參數(shù):
-l??? : Report the process group ID and working directory of the jobs.
-p??? : Report only the process group ID of the jobs.
-x??? : Replace any job_id found in command or arguments with the corresponding process ?
???????? group ID, and then execute command passing it arguments.
job?? : Specifies the job that you want to run in the background.

4.使用fg命令,將在后臺的job換到前臺
當你需要將在后臺的job換到前臺時,使用‘fg %job number’命令(也許不要‘%’也可以)。
lennon@lennon-laptop:~$?cp bigfile bigfile.bac &
[1] 3815
lennon@lennon-laptop:~$?fg 1
cp bigfile bigfile.bac

fg命令參考:
命令名稱:fg
使用權限:所有權限
命令描述:將后臺的任務移至前臺,如果是該任務處于暫停狀態(tài),則恢復該任務的運行。
???????? 注意該命令不是在所有的shell中都能運行。
語法:fg [%job]
參數(shù):
%job : Specifies the job that you want to run in the foreground.

5.如何結(jié)束一個job
如果你想結(jié)束一個正在運行的job,可以使用中斷鍵(interrupt key,通常是Ctrl-C)來結(jié)束。
lennon@lennon-laptop:~$ cp bigfile bigfile.bac?
^C
lennon@lennon-laptop:~$?
如果上面方法無法正常工作,那么你可以考慮使用Ctrl-Z(Suspend key)來暫停job,使用'jobs'命令來查看這個job的job number,然后通過'kill'命令來結(jié)束這個job.
lennon@lennon-laptop:~$?cp bigfile bigfile.bac?
^Z
[1]+? Stopped???????????????? cp bigfile bigfile.bac
lennon@lennon-laptop:~$?jobs
[1]+? Stopped???????????????? cp bigfile bigfile.bac
lennon@lennon-laptop:~$?kill %1
lennon@lennon-laptop:~$?
[1]+? Terminated????????????? cp bigfile bigfile.bac
'kill %1'中的'%'告訴系統(tǒng),后面的數(shù)字是一個job number。默認情況下,kill將會向程序發(fā)送一個termination signal(-TERM)。如果這個信號不起作用,考慮使用'kill -kill %job number'來發(fā)送一個kill signal(-KILL)。
'kill'命令的使用,就看man把,info也可以,這里不說了,上面東西太多。不過常用的也就'kill %job number'、'kill -kill %job number'、'kill [-kill] PID'。


Linux下Ctrl-Z、Ctrl-C、Ctrl-D的具體含義
初識Linux,可能會對Ctrl-Z、Ctrl-C、Ctrl-D的具體含義混淆不清,因為這三個按鍵都能夠在一些情況下使shell退出正在執(zhí)行的命令或程序,提示用戶輸入下一個命令,從而對初識者造成假象,認為三個鍵的功能一樣,但具體情況下哪個按鍵能起作用、起什么作用卻拿捏不定。

??? Ctrl-Z:該鍵是linux下面默認的掛起鍵(Suspend Key),當鍵入Ctrl-Z時,系統(tǒng)會將正在運行的程序掛起,然后放到后臺,同時給出用戶相關的job信息。此時,程序并沒有真正的停止,用戶可以通過使用fg、bg命令將job恢復到暫停前的上下文環(huán)境,并繼續(xù)執(zhí)行。
??? Ctrl-C:該鍵是linux下面默認的中斷鍵(Interrupt Key),當鍵入Ctrl-C時,系統(tǒng)會發(fā)送一個中斷信號給正在運行的程序和shell。具體的響應結(jié)果會根據(jù)程序的不同而不同。一些程序在收到這個信號后,會立即結(jié)束并推出程序,一些程序可能會忽略這個中斷信號,還有一些程序在接受到這個信號后,會采取一些其他的動作(Action)。當shell接受到這個中斷信號的時候,它會返回到提示界面,并等待下一個命令。
??? Ctrl-D:該鍵是Linux下面標準輸入輸出的EOF。在使用標準輸入輸出的設備中,遇到該符號,會認為讀到了文件的末尾,因此結(jié)束輸入或輸出。




Linux下使Shell?命令脫離終端在后臺運行

?(2012-02-05 21:41:57)

你是否遇到過這樣的情況:從終端軟件登錄遠程的Linux主機,將一堆很大的文件壓縮為一個.tar.gz文件,連續(xù)壓縮了半個小時還沒有完成,這時,突然你斷網(wǎng)了,你登錄不上遠程Linux主機了,那么前面的半個小時就會前功盡棄,你非常氣憤……

在Linux下,如果你要執(zhí)行的shell命令耗時特別長,并且:(1)你的網(wǎng)絡不穩(wěn)定,隨時可能斷網(wǎng);或者(2)你在執(zhí)行了shell命令之后必須要關閉終端軟件(例如SecureCRT)。


那么你就需要以脫離終端的方式在后臺運行這個shell命令。

方法如下:

(1)輸入命令:

nohup 你的shell命令 &

(2)回車,使終端回到shell命令行;

(3)輸入exit命令退出終端:

exit

(4)現(xiàn)在可以關閉你的終端軟件了,等過足夠的時間,讓你的shell命令執(zhí)行完了再上去看結(jié)果吧。

其中,nohup命令可以讓你的shell命令忽略SIGHUP信號,即可以使之脫離終端運行;“&”可以讓你的命令在后臺運行。

以脫離終端的方式在后臺運行shell命令有這樣幾個好處:只要你執(zhí)行過了命令,那么你的網(wǎng)絡中斷不會對你有任何影響,并且你就可以關閉終端軟件了。

?

本篇文章來源于 Linux公社網(wǎng)站(www.linuxidc.com)??原文鏈接:http://www.linuxidc.com/Linux/2011-05/35723.htm

?

?

?

用運程終端登陸Linux后運行的程序,當關閉終端時程序也被終至,下面的方法可以讓程序在后臺運行。

Unix/Linux下一般比如想讓某個程序在后臺運行,很多都是使用 & 在程序結(jié)尾來讓程序自動運行。比如我們要運行mysql在后臺:

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

 但是加入我們很多程序并不象mysqld一樣做成守護進程可能我們的程序只是普通程序而已,一般這種程序使用 & 結(jié)尾,但是如果終端關閉,那么程序也會被關閉。但是為了能夠后臺運行,那么我們就可以使用nohup這個命令,比如我們有個test.php需要在后臺運行,并且希望在后臺能夠定期運行,那么就使用nohup:

  nohup /root/test.php &

  提示:

  [~]$ appending output to nohup.out

  嗯,證明運行成功,同時把程序運行的輸出信息放到當前目錄的 nohup.out 文件中去。


附:nohup命令參考

  nohup 命令

  用途:不掛斷地運行命令。

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

  描述:nohup 命令運行由 Command 參數(shù)和任何相關的 Arg 參數(shù)指定的命令,忽略所有掛斷(SIGHUP)信號。在注銷后使用 nohup 命令運行后臺中的程序。要運行后臺中的 nohup 命令,添加 & ( 表示“and”的符號)到命令的尾部。

  無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 文件中。如果當前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out 文件中。如果沒有文件能創(chuàng)建或打開以用于追加,那么 Command 參數(shù)指定的命令不可調(diào)用。如果標準錯誤是一個終端,那么把指定的命令寫給標準錯誤的所有輸出作為標準輸出重定向到相同的文件描述符。

  退出狀態(tài):該命令返回下列出口值:

  126 可以查找但不能調(diào)用 Command 參數(shù)指定的命令。

  127 nohup 命令發(fā)生錯誤或不能查找由 Command 參數(shù)指定的命令。

  否則,nohup 命令的退出狀態(tài)是 Command 參數(shù)指定命令的退出狀態(tài)。


nohup命令及其輸出文件

  nohup命令:如果你正在運行一個進程,而且你覺得在退出帳戶時該進程還不會結(jié)束,那么可以使用nohup命令。該命令可以在你退出帳戶/關閉終端之后繼續(xù)運行相應的進程。nohup就是不掛起的意思( no hang up)。

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


使用nohup命令提交作業(yè)

  如果使用nohup命令提交作業(yè),那么在缺省情況下該作業(yè)的所有輸出都被重定向到一個名為nohup.out的文件中,除非另外指定了輸出文件:

  nohup command > myout.file 2>&1 &

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







Linux 技巧:讓進程在后臺可靠運行的幾種方法



我們經(jīng)常會碰到這樣的問題,用 telnet/ssh 登錄了遠程的 Linux 服務器,運行了一些耗時較長的任務, 結(jié)果卻由于網(wǎng)絡的不穩(wěn)定導致任務中途失敗。如何讓命令提交后不受本地關閉終端窗口/網(wǎng)絡斷開連接的干擾呢?下面舉了一些例子, 您可以針對不同的場景選擇不同的方式來處理這個問題。


nohup/setsid/&

場景:

如果只是臨時有一個命令需要長時間運行,什么方法能最簡便的保證它在后臺穩(wěn)定運行呢?

hangup 名稱的來由

在 Unix 的早期版本中,每個終端都會通過 modem 和系統(tǒng)通訊。當用戶 logout 時,modem 就會掛斷(hang up)電話。 同理,當 modem 斷開連接時,就會給終端發(fā)送 hangup 信號來通知其關閉所有子進程。

解決方法:

我們知道,當用戶注銷(logout)或者網(wǎng)絡斷開時,終端會收到 HUP(hangup)信號從而關閉其所有子進程。因此,我們的解決辦法就有兩種途徑:要么讓進程忽略 HUP 信號,要么讓進程運行在新的會話里從而成為不屬于此終端的子進程。

1. nohup

nohup 無疑是我們首先想到的辦法。顧名思義,nohup 的用途就是讓提交的命令忽略 hangup 信號。讓我們先來看一下 nohup 的幫助信息:

NOHUP(1) User Commands NOHUP(1)NAMEnohup - run a command immune to hangups, with output to a non-ttySYNOPSISnohup COMMAND [ARG]...nohup OPTIONDESCRIPTIONRun COMMAND, ignoring hangup signals.--help display this help and exit--versionoutput version information and exit

可見,nohup 的使用是十分方便的,只需在要處理的命令前加上 nohup 即可,標準輸出和標準錯誤缺省會被重定向到 nohup.out 文件中。一般我們可在結(jié)尾加上"&"來將命令同時放入后臺運行,也可用">filename?2>&1"來更改缺省的重定向文件名。

nohup 示例 [root@pvcent107 ~]# nohup ping www.ibm.com & [1] 3059 nohup: appending output 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

nohup 無疑能通過忽略 HUP 信號來使我們的進程避免中途被中斷,但如果我們換個角度思考,如果我們的進程不屬于接受 HUP 信號的終端的子進程,那么自然也就不會受到 HUP 信號的影響了。setsid 就能幫助我們做到這一點。讓我們先來看一下 setsid 的幫助信息:

SETSID(8) Linux Programmer’s Manual SETSID(8)NAMEsetsid - run a program in a new sessionSYNOPSISsetsid program [ arg ... ]DESCRIPTIONsetsid runs a program in a new session.

可見 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。&

這里還有一個關于 subshell 的小技巧。我們知道,將一個或多個命名包含在“()”中就能讓這些命令在子 shell 中運行中,從而擴展出很多有趣的功能,我們現(xiàn)在要討論的就是其中之一。

當我們將"&"也放入“()”內(nèi)之后,我們就會發(fā)現(xiàn)所提交的作業(yè)并不在作業(yè)列表中,也就是說,是無法通過jobs來查看的。讓我們來看看為什么這樣就能躲過 HUP 信號的影響吧。

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 [root@pvcent107 ~]#

從上例中可以看出,新提交的進程的父 ID(PPID)為1(init 進程的 PID),并不是當前終端的進程 ID。因此并不屬于當前終端的子進程,從而也就不會受到當前終端的 HUP 信號的影響了。

回頁首

disown

場景:

我們已經(jīng)知道,如果事先在命令前加上 nohup 或者 setsid 就可以避免 HUP 信號的影響。但是如果我們未加任何處理就已經(jīng)提交了命令,該如何補救才能讓它避免 HUP 信號的影響呢?

解決方法:

這時想加 nohup 或者 setsid 已經(jīng)為時已晚,只能通過作業(yè)調(diào)度和 disown 來解決這個問題了。讓我們來看一下 disown 的幫助信息:

disown [-ar] [-h] [jobspec ...]Without options, each jobspec is removed from the table ofactive jobs. If the -h option is given, each jobspec is notremoved from the table, but is marked so that SIGHUP is notsent to the job if the shell receives a SIGHUP. If no jobspecis present, and neither the -a nor the -r option is supplied,the current job is used. If no jobspec is supplied, the -aoption means to remove or mark all jobs; the -r option withouta jobspec argument restricts operation to running jobs. Thereturn value is 0 unless a jobspec does not specify a validjob.

可以看出,我們可以用如下方式來達成我們的目的。

靈活運用 CTRL-z

在我們的日常工作中,我們可以用 CTRL-z 來將當前進程掛起到后臺暫停運行,執(zhí)行一些別的操作,然后再用 fg 來將掛起的進程重新放回前臺(也可用 bg 來將掛起的進程放在后臺)繼續(xù)運行。這樣我們就可以在一個終端內(nèi)靈活切換運行多個任務,這一點在調(diào)試代碼時尤為有用。因為將代碼編輯器掛起到后臺再重新放回時,光標定位仍然停留在上次掛起時的位置,避免了重新定位的麻煩。

  • ?
  • ?
  • ?

&

?

&&& &&&

  • ?
  • ?
  • ?
  • ?

&

&




????

&

?????????????





總結(jié)

以上是生活随笔為你收集整理的【OS】Linux命令如何放到后台运行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。