2007年10月30日 星期二

把命令放到背景執行

Linux 允許把命令放到背景中執行,僅僅需要在命令的最後加上一個 &,就可以利用 Linux 的多工特性執行多個背景程式,如以下:
bang@linuxdiary:~$ sleep 300 &
[1] 8521
bang@linuxdiary:~$ sleep 500 &
[2]8522
  • [1] 代表指定給該工作的序號

  • 8521 代表 PID (process ID)
若想查詢當前的背景工作可使用 jobs 指令,
bang@linuxdiary:~$ jobs
[1] - Running sleep 300 &
[2]+ Running sleep 500 &
bang@linuxdiary:~$ jobs -l
[1] - 8521 Running sleep 300 &
[2]+ 8522 Running sleep 500 &

但如果後悔把命令放入背景時怎麼辦?你可以利用 fg 命令把工作帶回前景 (foreground);如果背景中堆積了好幾個命令,可用行程識別碼或工作序號來挑選他們。
bang@linuxdiary:~$ fg %1
sleep 300

bang@linuxdiary:~$ fg 8521
sleep 300

正在前景中執行的 sleep 300 是否困擾著你,可以不要等待嗎? 是的~ 可以
此時你可以點擊鍵盤上的組合鍵 Ctrl + Z ( 暫停程序,並將程序放置背景 )
bang@linuxdiary:~$ fg %1
sleep 300 => Ctrl + Z

[1]+ Stopped sleep 300
但此時的工作是暫停的,若希望它能繼續在背景中執行,可利用 bg 命令恢復在背景(background) 中暫停的工作。
bang@linuxdiary:~$ bg %1
[1]+ sleep 300 &
bang@linuxdiary:~$ jobs
[1] - Running sleep 300 &
[2]+ Running sleep 500 &
如果想要刪除在背景的工作可用 kill 來完成
bang@linuxdiary:~$ kill %2
[2]+ Terminated sleep 500
最後介紹的指令,將對常用 ssh 遠端登入的使用者很有幫助,nohup (no hang up,不要掛斷)。當使用者利用 ssh 等指令或軟體登入主機後,想要執行某個指令,但一旦登出或關掉 ssh 軟體,那個在背景執行的工作會跟著消失,主要原因是它的父行程被關閉了,也就是使用者剛剛關閉的 bash,那怎麼辦?nohup 可以為您強制保存背景工作,即便父行程被關閉,以下為示範
bang@linuxdiary:~$ nohup sleep 500 &
[1] 8544
bang@linuxdiary:~$ nohup: appending output to `nohup.out'

bang@linuxdiary:~$ ps -fC sleep (用 ps 查詢正在用 sleep 命令執行的行程)
UID PID PPID C STIME TTY TIME CMD
root 8544 8014 0 16:41 pts/1 00:00:00 sleep 500
此時關閉 shell,重新登入
bang@linuxdiary:~$ ps -fC sleep
UID PID PPID C STIME TTY TIME CMD
root 8544 1 0 16:42 pts/1 00:00:00 sleep 500

會發現它還存在著,但 PPID 變為 1,亦即父行程被指派為 init,這個背景工作不會再受父行程關閉而關閉影響,因為如果想關閉 init,那就關機吧。

沒有留言: