後臺執行的程序會有一個pid,查看後臺程序主要用到jobs,ps 關閉後臺程序用到killpython
一. 有關進程的幾種經常使用方法linux
1.1 & 符號shell
在命令後面加上一個 & 符號,表示該命令放在後臺執行,如:bash
[[noc@dpi_netquery_new01 ~]$ crontab -l #30 7 * * * /DPI_DATA/NOC/3G/NOC_3G_APP_SUMMARY/summary.sh >> /DPI_DATA/NOC/3G/NOC_3G_APP_SUMMARY/summary.log #20 9 * * * python /home/noc/work/dpi_summary.py >> /DPI_DATA/NOC/3G/NOC_3G_APP_SUMMARY/summary.log
1.2 Jobs 命令服務器
該命令能夠查看當前有多少在後臺運行的命令,jobs 列出當前shell環境中已啓動的任務狀態,若未指定jobs id,則顯示全部活動的任務狀態信息。session
jobs命令執行的結果,+表示是一個當前的做業,減號表是是一個當前做業以後的一個做業,jobs -l選項可顯示全部任務的PID,jobs的狀態能夠是running, stopped, Terminated,可是若是任務被終止了(kill),shell 從當前的shell環境已知的列表中刪除任務的進程標識;也就是說,jobs命令顯示的是當前shell環境中所起的後臺正在運行或者被掛起的任務信息。如:oracle
[noc@dpi_netquery_new01 ~]$ jobs [noc@dpi_netquery_new01 ~]$
在這裏講一個概念:當前任務ide
若是後臺的任務號有2個,[1],[2];若是當第一個後臺任務順利執行完畢,第二個後臺任務還在執行中時,當前任務便會自動變成後臺任務號碼「[2]」的後臺任務。因此能夠得出一點,即當前任務是會變更的。當用戶輸入「fg」、「bg」,"stop」等命令時,若是不加任何引號,則所變更的均是當前任務。this
1.3 fg 命令(foreground)spa
該命令將後臺運行的進程調到前臺來運行。 具體用法: fg %n。
這裏的N 是jobs 看到的job number。 如:
[noc@dpi_netquery_new01 ~]$ fg
-bash: fg: current: no such job
1.4 ctrl + z 組合鍵
該命令將一個正在前臺執行的命令放到後臺,而且暫停。
1.5 bg命令(background)
該命令將一個在後臺暫停運行的命令,變成繼續在後臺執行的命令。
用法:bg %n。 N 是jobs命令查看到的job number。 如:
[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查看進程的job number,而後用命令: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 啓動的進程雖然也是不中斷的執行,可是當進程執行完畢後就會退出。