> 和 >>當(dāng)某個命令在前臺運行時 , 如果您想終止它 , 請按 CtrlC: $ sleep 10 (Press Control-C $ jobs $您的 Shell 能使進程的掛起。對話 UNIX,第 8 部分: UNIX 進程( 四 )。" />

日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

對話 UNIX,第 8 部分: UNIX 進程( 四 )


$ sleep 10 & sleep 10 & sleep 10 &
[7] 17741
[8] 17742
[9] 17743
$ kill %7
$ jobs
[7]Terminated sleep 10
[8]- Running sleep 10 &
[9]Running sleep 10 &
$ fg %8
sleep 10從命令行中同時異步運行多個命令 , 是處理您自己的任務(wù)集的好方法 。一個長時間運行的工作(例如 , 系統(tǒng)管理的數(shù)值計算或大型程序的編譯)最適合放在后臺 。為了捕獲每個后臺命令的輸出 , 請考慮使用重定向操作符 >、>&、>> 和 >>& , 將輸入重定向到某個文件 。當(dāng)后臺命令結(jié)束后 , shell 會在下一個提示符之前顯示一條警告消息:
$ whoami
mstreicher
[8]- Donesleep 10
[9]Donesleep 10
$向遙遠的進程池前進
某些進程會一直存活(如 init) , 而某些進程會以新的形式重生(如您的 shell) 。最終大多進程都會因自然原因(即程序運行結(jié)束)而消亡 。
此外 , 您還可以將某個進程放在一個掛起的動作序列中 , 等待被再次激活 。正如先前的示例所示 , 您可以用 kill 提前終止某個進程 。
當(dāng)某個命令在前臺運行時 , 如果您希望將它掛起 , 請按 CtrlZ:
$ sleep 10
(Press Control-Z)
[1]Stopped sleep 10
$ ps
 PID PPID USER COMMAND S STIME TIME
18195 16351 mstreic sleep 10 T 12:44 00:00:00Shell 已將命令掛起 , 為了方便起見 , 還為它分配了一個標簽 。您可以像先前那樣使用這個標簽 , 以終止工作或讓工作返回前臺 。您還可以使用 bg 命令在后臺恢復(fù)這個進程:
bg %1
[1]sleep 10 &當(dāng)某個命令在前臺運行時 , 如果您想終止它 , 請按 CtrlC:
$ sleep 10
(Press Control-C
$ jobs
$您的 Shell 能使進程的掛起和終止變得更容易 , 但在 Shell 單純的外表下 , 卻隱藏著復(fù)雜的一面 。在內(nèi)部 , Shell 使用 Unix 信號來影響進程的狀態(tài) 。信號是一個事件 , 它被用來向某個進程發(fā)出警報 。操作系統(tǒng)生成許多信號 , 但您可以將信號從一個進程發(fā)送到另一個進程 , 甚至能讓某個進程給自己發(fā)送信號 。
UNIX 包括多種信號 , 它們大多都有特殊目的 。例如 , 如果您將信號 SIGSTOP 發(fā)送到某個進程 , 該進程將掛起 。(要獲取信號的完整列表 , 請鍵入 man 7 signal 或鍵入 kill -L) 。您可以用 kill 命令發(fā)送信號 。
$ sleep 20 &
[1] 19988
$ kill -SIGSTOP 19988
$ jobs
[1]Stopped sleep 20起初 , sleep 命令在后臺啟動 , 其進程 ID 為 19988 。在發(fā)送 SIGSTOP 之后 , 該進程會改變狀態(tài) , 變?yōu)閽炱鸹蛲V?。發(fā)送另一個信號 SIGCONT , 重新激活進程 , 該進程將從上次停止的地方繼續(xù)執(zhí)行 。
也就是說 , 每次您按 CtrlZ 時 , 您的 shell 將向前臺發(fā)送 SIGSTOP 信號 。bg 命令發(fā)送 SIGCONT 。而 CtrlC 則會發(fā)送 SIGTERM , 要求立即終止進程 。
一些信號可以被某個進程阻塞 , 應(yīng)用程序可以通過設(shè)計 , 顯式地“捕捉 (catch)信號 , 并以一種特殊的方式對每個事件作出反應(yīng) 。例如 , 系統(tǒng)服務(wù) xinetd 會按需要啟動其他網(wǎng)絡(luò)服務(wù) , 它在收到 SIGHUP 時會重新讀取它的配置文件 。在 Linux 中 , 向 init 發(fā)送信號 , 可能會改變系統(tǒng)的運行級別 , 甚至?xí)?dǎo)致系統(tǒng)關(guān)閉 。.(這里有一個問題:kill %1 和 kill 1 有什么區(qū)別?
進程甚至可以給自己發(fā)送信號 。想像一下 , 您正在編寫一個游戲 , 想留給用戶五秒鐘時間作出反應(yīng) 。您的代碼可以設(shè)置一個五秒鐘的定時器 , 接下來繼續(xù)進行重繪屏幕等操作 。當(dāng)定時器的時間耗盡后 , 將有一個 SIGALRM 信號被送回您的進程 。呯!時間到!
(這里提供了問題的答案:kill %1 會終止標簽為 1 的后臺工作 。kill 1 會終止 init , 當(dāng)必須關(guān)閉計算機時 , 將向操作系統(tǒng)發(fā)送這個信號 。) 在特殊情況下 , 操作系統(tǒng)還可以將一些其他信號傳送給進程 。內(nèi)存違例會引發(fā) SIGSEGV 信號 , 立即終止進程 , 并留下一個內(nèi)核轉(zhuǎn)儲 。有一個特殊的信號 SIGKILL 是無法被阻塞或捕捉的 , 它會立即終止某個進程 。

推薦閱讀