【OS】Linux命令如何放到后台运行
【OS】Linux命令如何放到后臺運行
linux命令后臺運行
???有兩種方式:
???
二、&
在Linux中,當在前臺運行某個作業時,終端被該作業占據;而在后臺運行作業時,它不會占據終端。可以使用&命令把作業放到后臺執行。實際上,這樣是將命令放入到一個作業隊列中了:
但是如上方到后臺執行的進程,其父進程還是當前終端shell的進程,而一旦父進程退出,則會發送hangup信號給所有子進程,子進程收到hangup以后也會退出。如果我們要在退出shell的時候繼續運行進程,則需要使用nohup忽略hangup信號,或者setsid將將父進程設為init進程(進程號為1)
$ disown -h %1
$ (./test.sh &)
還有一種更加強大的方式是使用screen,首先創建一個斷開模式的虛擬終端,然后用-r選項重新連接這個虛擬終端,在其中執行的任何命令,都能達到nohup的效果,這在有多個命令需要在后臺連續執行的時候比較方便:
$ screen -dmS screen_test
$ screen -r screen_test
四、.*,?,[...],[!...]等? 下面就是這些特殊字符:? * 匹配文件名中的任何字符串,包括空字符串。? ? 匹配文件名中的任何單個字符。? [...] 匹配[ ]中所包含的任何字符。? [!...] 匹配[ ]中非感嘆號!之后的字符。? 當s h e l l遇到上述字符時,就會把它們當作特殊字符,而不是文件名中的普通字符,這樣用戶就可以用它們來匹配相應的文件名。
1)列出以i或o開頭的文件名:???? #ls [io]* 2)列出log.開頭、后面跟隨一個數字、然后可以是任意字符串的文件名: #ls log.[0-9]*? 3)與例二相反,列出log.開頭、后面不跟隨一個數字、然后可以是任意字符串的文件名 : #ls log.[!0-9]*? 4)列出所有以LPS開頭、中間可以是任何兩個字符,最后以1結尾的文件名:#ls LPS??1 5)列出所有以大寫字母開頭的文件名:$ ls [A-Z]* 6)列出所有以. 開頭的文件名(隱含文件,例如. profile、.rhosts、.histo ry等): $ ls .*
-
其他相關命令:
-
殺死進程
殺死已經啟動的程序和普通方式一樣:
- pkill -9?name
- killall?name
- kill?pid
- …
執行背景工作的指令
| 指令或符號 | 使用範例 | 說明 |
| & | % fasta & | 在背景中執行程式 |
| jobs | % jobs | 顯示送入背景之工作 |
| kill | % kill (job#) | 移除指定之批次工作 |
| ctrl-z | ? | 暫停前景中執行之程式 |
| bg | % bg | 將暫停之工作送入背景執行 |
| fg | % fg | 將背景之工作拉回前景執行 |
1.通過使用‘&’操作符讓Job在后臺運行
通常我們Linux的終端中,運行某一命令時,終端總是等待某一特定的命令或程序運行完以后,給出一個提示,然后我們才能繼續運行下一個命令。如果我們要運行一個比較耗時的命令,但是在該命令運行的同時還需要做另外的一些事,那該怎么辦呢?
你可以通過在命令的后面加上一個‘&’操作符,來讓一個任務在后臺運行。(當然如果你是用GUI界面,你也可以重新打開一個窗口運行新的命令或程序)
例如,我們需要拷貝一個比較大的文件,在拷貝的同時,還要做其他一些事情,那么在拷貝命令后面加上一個‘&’,讓它在后臺拷貝:
lennon@lennon-laptop:~$?cp /media/bigfile /home/lennon/Downloads/ &
[1] 3526
lennon@lennon-laptop:~$?
此時,我們可以看到在終端中,執行了某一命令后,給出了一些信息,然后就返回了,接著提示用戶可以出入下一個命令了,這樣程序或命令就在后臺執行了。
在顯示的信息中,用方括號括起來的數字,表示系統分配給這個Job的Job Number,這里'[1]'中的1,就是這個Job的Job Number。而后面一個比較大的數字,則是系統分配的進程ID(PID),這個PID在系統就代表這個進程。
在后臺運行的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命令,來查看當前系統中的Job
如果我們需要查看當前系統中,有那些job,使用‘jobs’命令:
lennon@lennon-laptop:~$?jobs
[1]-? Running???????????????? cp /media/bigfile /home/lennon/Downloads/ &
[2]+? Stopped???????????????? cat
lennon@lennon-laptop:~$?
如此時,顯示我的系統中有2個job,一個是剛才的正在運行的拷貝命令([1]標識),一個是停止運行的cat命令([2]表示)。這里‘Running’、‘Stopped’表示任務的狀態。
jobs命令參考
命令名稱:jobs
使用權限:所有權限
命令描述:列出系統中的job。注意:不是所有的shell都能使用此命令
語法:jobs [-p | -l] [-n] [-p] [-x] [job id]
參數:
-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運行了以后,發現這個是耗時的任務,并想將其放入到后臺運行,這樣你可以在這個任務運行的同時,完成一些其他的事情,那么你可以這樣做:
使用掛起鍵(Suspend Key,通常是Ctrl-Z)將該任務掛起(也就是暫停),然后使用‘bg’命令在后臺讓該job恢復執行。
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后,系統會將當前正在運行的job暫停,將其移至后臺,給出用戶改任務的提示(包括job number、狀態、job),然后提示用戶輸入下一個命令。
在job掛起后,可以使用‘bg’命令,讓job恢復到剛才中斷的地方繼續運行并將其放到后臺運行。使用‘bg %job number’來指定你需要對哪一個job進行操作,這里‘%’告訴系統后面的數字是一個job number(不要‘%’可能也可以)。當然在系統中只有一個job的時候,你也可以忽略改參數。
bg命令參考:
命令名稱:bg
使用權限:所有權限
命令描述:在后臺恢復已停止的job繼續運行。注意該命令不能在所有的Unix的shell下運行
語法:bg [-l] [-p] [-x] [job]
參數:
-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
使用權限:所有權限
命令描述:將后臺的任務移至前臺,如果是該任務處于暫停狀態,則恢復該任務的運行。
???????? 注意該命令不是在所有的shell中都能運行。
語法:fg [%job]
參數:
%job : Specifies the job that you want to run in the foreground.
5.如何結束一個job
如果你想結束一個正在運行的job,可以使用中斷鍵(interrupt key,通常是Ctrl-C)來結束。
lennon@lennon-laptop:~$ cp bigfile bigfile.bac?
^C
lennon@lennon-laptop:~$?
如果上面方法無法正常工作,那么你可以考慮使用Ctrl-Z(Suspend key)來暫停job,使用'jobs'命令來查看這個job的job number,然后通過'kill'命令來結束這個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'中的'%'告訴系統,后面的數字是一個job number。默認情況下,kill將會向程序發送一個termination signal(-TERM)。如果這個信號不起作用,考慮使用'kill -kill %job number'來發送一個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退出正在執行的命令或程序,提示用戶輸入下一個命令,從而對初識者造成假象,認為三個鍵的功能一樣,但具體情況下哪個按鍵能起作用、起什么作用卻拿捏不定。
??? Ctrl-Z:該鍵是linux下面默認的掛起鍵(Suspend Key),當鍵入Ctrl-Z時,系統會將正在運行的程序掛起,然后放到后臺,同時給出用戶相關的job信息。此時,程序并沒有真正的停止,用戶可以通過使用fg、bg命令將job恢復到暫停前的上下文環境,并繼續執行。
??? Ctrl-C:該鍵是linux下面默認的中斷鍵(Interrupt Key),當鍵入Ctrl-C時,系統會發送一個中斷信號給正在運行的程序和shell。具體的響應結果會根據程序的不同而不同。一些程序在收到這個信號后,會立即結束并推出程序,一些程序可能會忽略這個中斷信號,還有一些程序在接受到這個信號后,會采取一些其他的動作(Action)。當shell接受到這個中斷信號的時候,它會返回到提示界面,并等待下一個命令。
??? Ctrl-D:該鍵是Linux下面標準輸入輸出的EOF。在使用標準輸入輸出的設備中,遇到該符號,會認為讀到了文件的末尾,因此結束輸入或輸出。
Linux下使Shell?命令脫離終端在后臺運行
?(2012-02-05 21:41:57)你是否遇到過這樣的情況:從終端軟件登錄遠程的Linux主機,將一堆很大的文件壓縮為一個.tar.gz文件,連續壓縮了半個小時還沒有完成,這時,突然你斷網了,你登錄不上遠程Linux主機了,那么前面的半個小時就會前功盡棄,你非常氣憤……
在Linux下,如果你要執行的shell命令耗時特別長,并且:(1)你的網絡不穩定,隨時可能斷網;或者(2)你在執行了shell命令之后必須要關閉終端軟件(例如SecureCRT)。
那么你就需要以脫離終端的方式在后臺運行這個shell命令。
方法如下:
(1)輸入命令:
nohup 你的shell命令 &
(2)回車,使終端回到shell命令行;
(3)輸入exit命令退出終端:
exit
(4)現在可以關閉你的終端軟件了,等過足夠的時間,讓你的shell命令執行完了再上去看結果吧。
其中,nohup命令可以讓你的shell命令忽略SIGHUP信號,即可以使之脫離終端運行;“&”可以讓你的命令在后臺運行。
以脫離終端的方式在后臺運行shell命令有這樣幾個好處:只要你執行過了命令,那么你的網絡中斷不會對你有任何影響,并且你就可以關閉終端軟件了。
?
本篇文章來源于 Linux公社網站(www.linuxidc.com)??原文鏈接:http://www.linuxidc.com/Linux/2011-05/35723.htm
?
?
?
用運程終端登陸Linux后運行的程序,當關閉終端時程序也被終至,下面的方法可以讓程序在后臺運行。
Unix/Linux下一般比如想讓某個程序在后臺運行,很多都是使用 & 在程序結尾來讓程序自動運行。比如我們要運行mysql在后臺:
/usr/local/mysql/bin/mysqld_safe --user=mysql &
但是加入我們很多程序并不象mysqld一樣做成守護進程,可能我們的程序只是普通程序而已,一般這種程序使用 & 結尾,但是如果終端關閉,那么程序也會被關閉。但是為了能夠后臺運行,那么我們就可以使用nohup這個命令,比如我們有個test.php需要在后臺運行,并且希望在后臺能夠定期運行,那么就使用nohup:
nohup /root/test.php &
提示:
[~]$ appending output to nohup.out
嗯,證明運行成功,同時把程序運行的輸出信息放到當前目錄的 nohup.out 文件中去。
附:nohup命令參考
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就是不掛起的意思( no hang up)。
該命令的一般形式為:nohup command &
使用nohup命令提交作業
如果使用nohup命令提交作業,那么在缺省情況下該作業的所有輸出都被重定向到一個名為nohup.out的文件中,除非另外指定了輸出文件:
nohup command > myout.file 2>&1 &
在上面的例子中,輸出被重定向到myout.file文件中。
Linux 技巧:讓進程在后臺可靠運行的幾種方法
我們經常會碰到這樣的問題,用 telnet/ssh 登錄了遠程的 Linux 服務器,運行了一些耗時較長的任務, 結果卻由于網絡的不穩定導致任務中途失敗。如何讓命令提交后不受本地關閉終端窗口/網絡斷開連接的干擾呢?下面舉了一些例子, 您可以針對不同的場景選擇不同的方式來處理這個問題。
nohup/setsid/&
場景:
如果只是臨時有一個命令需要長時間運行,什么方法能最簡便的保證它在后臺穩定運行呢?
hangup 名稱的來由
在 Unix 的早期版本中,每個終端都會通過 modem 和系統通訊。當用戶 logout 時,modem 就會掛斷(hang up)電話。 同理,當 modem 斷開連接時,就會給終端發送 hangup 信號來通知其關閉所有子進程。
解決方法:
我們知道,當用戶注銷(logout)或者網絡斷開時,終端會收到 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 文件中。一般我們可在結尾加上"&"來將命令同時放入后臺運行,也可用">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 中運行中,從而擴展出很多有趣的功能,我們現在要討論的就是其中之一。
當我們將"&"也放入“()”內之后,我們就會發現所提交的作業并不在作業列表中,也就是說,是無法通過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
場景:
我們已經知道,如果事先在命令前加上 nohup 或者 setsid 就可以避免 HUP 信號的影響。但是如果我們未加任何處理就已經提交了命令,該如何補救才能讓它避免 HUP 信號的影響呢?
解決方法:
這時想加 nohup 或者 setsid 已經為時已晚,只能通過作業調度和 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 來將當前進程掛起到后臺暫停運行,執行一些別的操作,然后再用 fg 來將掛起的進程重新放回前臺(也可用 bg 來將掛起的進程放在后臺)繼續運行。這樣我們就可以在一個終端內靈活切換運行多個任務,這一點在調試代碼時尤為有用。因為將代碼編輯器掛起到后臺再重新放回時,光標定位仍然停留在上次掛起時的位置,避免了重新定位的麻煩。
- ?
- ?
- ?
&
?
&&& &&&
- ?
- ?
- ?
- ?
&
&
|
????
&
?????????????
|
| | |
總結
以上是生活随笔為你收集整理的【OS】Linux命令如何放到后台运行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P2894 [USACO08FEB]酒店
- 下一篇: redis-持久化