linux查看和关闭后台执行程序
詳細說明轉自http://blog.csdn.net/tianlesoftware/article/details/6165753
一.?有關進程的幾種常用方法
1.1??&?符號
在命令后面加上一個?&?符號,表示該命令放在后臺執行,如:
[oracle@singledb ~]$ crontab -l
20 17 * * * /u02/rman_incremental_backup.sh &
?
1.2??Jobs?命令
???????該命令可以查看當前有多少在后臺運行的命令,jobs?列出當前shell環境中已啟動的任務狀態,若未指定jobsid,則顯示所有活動的任務狀態信息。
?
jobs命令執行的結果,+表示是一個當前的作業,減號表是是一個當前作業之后的一個作業,jobs -l選項可顯示所有任務的PID,jobs的狀態可以是running, stopped, Terminated,但是如果任務被終止了(kill),shell?從當前的shell環境已知的列表中刪除任務的進程標識;也就是說,jobs命令顯示的是當前shell環境中所起的后臺正在運行或者被掛起的任務信息。如:
[oracle@singledb ~]$ jobs
[1]+??Running???/u02/rman_incremental_backup.sh??&
?
在這里講一個概念:當前任務
如果后臺的任務號有2個,[1],[2];如果當第一個后臺任務順利執行完畢,第二個后臺任務還在執行中時,當前任務便會自動變成后臺任務號碼“[2]”的后臺任務。所以可以得出一點,即當前任務是會變動的。當用戶輸入“fg”、“bg”和“stop”等命令時,如果不加任何引號,則所變動的均是當前任務。
?
1.3 fg?命令(foreground)
???????該命令將后臺運行的進程調到前臺來運行。?具體用法:?fg %n。
???????這里的N?是jobs?看到的jobnumber。?如:
?
[oracle@singledb ~]$ fg %1
-bash: fg: job has terminated
[1]+??Exit 1??/u02/rman_incremental_backup.sh > /u02/rman.log 2>&1
?
1.4??ctrl + z?組合鍵
???????該命令將一個正在前臺執行的命令放到后臺,并且暫停。
?
1.5??bg命令(background)
???????該命令將一個在后臺暫停運行的命令,變成繼續在后臺執行的命令。
???????用法:bg %n。?N?是jobs命令查看到的jobnumber。?如:
?
[oracle@singledb ~]$ /u02/rman_incremental_backup.sh
[1]+??Stopped?????????????????/u02/rman_incremental_backup.sh
--?我們運行備份命令,然后按下CTRL+Z
[oracle@singledb ~]$ jobs
[1]+??Stopped?????????????????/u02/rman_incremental_backup.sh
--用jobs查看進程狀態
[oracle@singledb ~]$ fg %1
/u02/rman_incremental_backup.sh
--用fg將進程調到前臺運行
[1]+??Stopped?????????????????/u02/rman_incremental_backup.sh
--按下ctrl+z
[oracle@singledb ~]$ bg %1
[1]+ /u02/rman_incremental_backup.sh &
--用bg將后臺暫停的進程繼續執行,這里自動加了一個&?符號
[oracle@singledb ~]$ jobs
[1]+??Running?????????????????/u02/rman_incremental_backup.sh &
--查看job?狀態
?
1.6??結束正在運行的進程
1.6.1?結束前臺進程
???????這種只需要按下組合鍵:?ctrl + c?即可。
?
1.6.2?結束后臺運行的進程
???????這種情況下也有兩種方法:
(1)用jobs查看進程的jobnumber,然后用命令:kill %n?來結束。
(2)用ps?查看進程的pid,然后用命令:kill pid?來結束。
?
???????這里對kill?做點說明,kill除了可以終止進程,還能給進程發送其它信號,使用kill -l?可以察看kill支持的信號。
?
[oracle@singledb ~]$ kill -l
?1) SIGHUP???????2) SIGINT???????3) SIGQUIT??????4) SIGILL
?5) SIGTRAP??????6) SIGABRT??????7) SIGBUS???????8) SIGFPE
?9) SIGKILL?????10) SIGUSR1?????11) SIGSEGV?????12) SIGUSR2
13) SIGPIPE?????14) SIGALRM?????15) SIGTERM?????16) SIGSTKFLT
17) SIGCHLD?????18) SIGCONT?????19) SIGSTOP?????20) SIGTSTP
21) SIGTTIN?????22) SIGTTOU?????23) SIGURG??????24) SIGXCPU
25) SIGXFSZ?????26) SIGVTALRM???27) SIGPROF?????28) SIGWINCH
29) SIGIO???????30) SIGPWR??????31) SIGSYS??????34) SIGRTMIN
35) SIGRTMIN+1??36) SIGRTMIN+2??37) SIGRTMIN+3??38) SIGRTMIN+4
39) SIGRTMIN+5??40) SIGRTMIN+6??41) SIGRTMIN+7??42) SIGRTMIN+8
43) SIGRTMIN+9??44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9??56) SIGRTMAX-8??57) SIGRTMAX-7??58) SIGRTMAX-6
59) SIGRTMAX-5??60) SIGRTMAX-4??61) SIGRTMAX-3??62) SIGRTMAX-2
63) SIGRTMAX-1??64) SIGRTMAX
?
SIGTERM是不帶參數時kill發送的信號,意思是要進程終止運行,但執行與否還得看進程是否支持。如果進程還沒有終止,可以使用kill -SIGKILL pid,這是由內核來終止進程,進程不能監聽這個信號。
?
1.7??ps?命令
???????該命令用戶列出系統中正在運行的進程。?常用的參數:ps -ef
?
關于這2個參數含義,參考ps?命令的幫助:
[oracle@singledb ~]$ ps --help
********* simple selection *********??********* selection by list *********
-A all processes??????????????????????-C by command name
-N negate selection???????????????????-G by real group ID (supports names)
-a all w/ tty except session leaders??-U by real user ID (supports names)
-d all except session leaders?????????-g by session OR by effective group name
-e all processes??????????????????????-p by process ID
T??all processes on this terminal?????-s processes in the sessions given
a??all w/ tty, including other users??-t by tty
g??OBSOLETE -- DO NOT USE?????????????-u by effective user ID (supports names)
r??only running processes?????????????U??processes for specified users
x??processes w/o controlling ttys?????t??by tty
*********** output format **********??*********** long options ***********
-o,o user-defined??-f full????????????--Group --User --pid --cols --ppid
-j,j job control???s??signal??????????--group --user --sid --rows --info
-O,O preloaded -o??v??virtual memory??--cumulative --format --deselect
-l,l long??????????u??user-oriented???--sort --tty --forest --version
-F???extra full????X??registers???????--heading --no-heading --context
????????????????????********* misc options *********
-V,V??show version??????L??list format codes??f??ASCII art forest
-m,m,-L,-T,H??threads???S??children in sum????-y change -l format
-M,Z??security data?????c??true command name??-c scheduling class
-w,w??wide output???????n??numeric WCHAN,UID??-H process hierarchy
?
?
二.?前臺進程和后臺進程的一點討論
???????整理這篇文章的目的就是弄清楚在實際使用中這兩種進程的區別。?一般情況下,我們都是通過shell?連接到linux?服務器上,那么,假如我們在這個shell?窗口執行一個備份或者其他命令,即前臺命令。?在這個時候,前臺命令沒有執行完,我們把這個終端關閉了,那么這個命令也就會中斷。?即使我們在執行命令時加了&?符號,讓進程在后臺執行,終端的關閉也會造成命令的結束。
?
?
解決這個問題有兩種方法:
(1)將命令添加到crontab里,讓系統自己調用。
??????????????這種方法將使命令在服務器端執行,這樣即使終端關閉,也不影響命令的執行。
(2)使用nohup命令(no hang up)。
???????該命令用于保證不掛斷地運行命令。如:
[oracle@singledb ~]$ nohup /u02/rman_incremental_backup.sh &
[1] 4409
[oracle@singledb ~]$ jobs
[1]+??Running?????????????????nohup /u02/rman_incremental_backup.sh &
?
這里要注意:
???????運行nohup命令后,按任意鍵返回shell?窗口,然后輸入exit退出終端,不能直接關閉窗口,直接關閉窗口的話,還是會造成命令進程和終端一起結束。
?
???????在Unix中永久的后臺進程稱為守護進程(daemon)。守護進程通常從系統啟動時自動開始執行,系統關閉時才停止。而nohup?啟動的進程雖然也是不中斷的執行,但是當進程執行完畢后就會退出。
總結
以上是生活随笔為你收集整理的linux查看和关闭后台执行程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 的变量作用域和 LEGB
- 下一篇: linux 线程管理、同步机制等