跳轉到內容

Unix/作業控制快速入門

來自華夏公益教科書


控制 Unix 中的作業

[編輯 | 編輯原始碼]

Unix 中的程序 - 也就是正在執行特定任務的程式 - 可以執行在前臺後臺。前臺作業會在當前 shell 中顯示,並且您無法與 shell 互動,直到作業完成或被中斷。後臺作業啟動後會立即返回到提示符,您可以在後臺程序繼續執行的同時輸入更多命令。後臺作業可以寫入當前終端視窗。

作業預設情況下會執行在前臺。

後臺作業

[編輯 | 編輯原始碼]

您可以選擇在後臺啟動作業,或者在作業啟動後將其傳送到後臺。

在後臺啟動作業

[編輯 | 編輯原始碼]

在啟動作業的命令末尾追加&。例如,我們可以使用 GNU C 編譯器在後臺編譯程式 hello,如下所示

% gcc hello.c -o hello &

將已啟動的作業移到後臺

[編輯 | 編輯原始碼]

如果您在前臺啟動了作業,可以將其移到後臺。首先,使用 Ctrl+Z 停止作業,然後使用bg命令將停止的作業傳送到後臺。例如,我們可以啟動 web 瀏覽器 Lynx,停止它,並將其傳送到後臺,如下所示

%lynx
^z
%bg

使用 Ctrl+Z 停止的作業被傳遞到後臺並繼續執行。

將作業移到前臺

[編輯 | 編輯原始碼]

您可以使用fg命令將作業調回前臺。單獨使用它將調回最近在後臺啟動的作業。如果我們剛剛將 lynx 傳送到後臺,如上所示,那麼

% fg

將把作業移到前臺。

哪些作業正在執行?

[編輯 | 編輯原始碼]

可以使用以下兩個命令之一來查詢哪些作業正在後臺執行。

jobs命令在許多 shell 中可用,並報告正在執行的作業、作業編號、程序名稱(如果您希望使用-l選項檢視程序組 ID)。您可以像這樣使用它

%jobs

.

在輸出中,方括號('[' 和 ']')中的數字是作業編號,這些編號由fgbg等程序控制命令使用。

ps命令將列印有關當前執行的程序的資訊。實際上,它比這要複雜一些。該命令列印有關當前終端和當前有效使用者 ID 控制的程序的資訊。某些命令需要用於控制程序的程序標識號,在這種情況下,該資訊將出現在輸出的第一列中。

%ps

使用作業編號

[編輯 | 編輯原始碼]

現在您可以使用 jobs 或 ps 識別作業編號,可以使用它們來控制作業。如果您在後臺運行了多個作業,可以透過使用作業編號選擇一個作業並將其調回前臺。您可以透過新增作業編號來使用fg命令,而不是直接使用fg命令,例如

%fg 2

這將把編號為 2 的作業(由jobs標識)調回前臺。

殺死作業

[編輯 | 編輯原始碼]

您可以透過不同的方式終止 Unix 作業。一種簡單的方法是將作業調回前臺並終止它,例如使用 Ctrl+C。

Unix 命令kill可用於終止後臺程序。您可以使用作業編號(在前面加上 %)或程序標識號 (PID) 作為kill命令的引數。一個常見的誤解是需要使用 -9(SIGKILL 訊號)來終止程序。這是一個不好的做法,因為 SIGKILL 訊號不允許程序正常終止,而是會立即終止它。這會導致記憶體管理問題。正確終止程序的方式是使用 -2(SIGINT)訊號,它允許程序執行清理工作

%kill -2 %2

%2 指定了程序的 PID。要使用作業編號殺死作業,請省略百分號

%kill -2 1367

如果 -2 訊號不起作用,該程序可能被阻塞或執行不正常。在這種情況下,請使用 -1(SIGHUP)、-15(SIGTERM),最後再嘗試使用 -9(SIGKILL)。

華夏公益教科書