linux 前臺進程 後臺進程





. 有關進程的幾種常用方法

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 窗口執行一個備份或者其他命令,即前臺命令。 在這個時候,前臺命令沒有執行完,我們把這個終端關閉了,那麼這個命令也就會中斷。 即使我們在執行命令時加了& 符號,讓進程在後臺執行,終端的關閉也會造成命令的結束。

 

 轉自:http://blog.csdn.net/tianlesoftware/article/details/6165753




解決這個問題有兩種方法:

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 啓動的進程雖然也是不中斷的執行,但是當進程執行完畢後就會退出。

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章