工作處理

創造就業機會

要建立作業,只需在命令後附加一個 &

$ sleep 10 &
[1] 20024

你還可以通過按 Ctrl + 使正在執行的程序成為作業 z :

$ sleep 10
^Z
[1]+  Stopped                 sleep 10

背景和前景一個過程

要將 Process 置於前臺,命令 fg%一起使用

$ sleep 10 &
[1] 20024

$ fg %1
sleep 10

現在你可以與流程進行互動。要將其恢復到後臺,你可以使用 bg 命令。由於佔用終端會話,你需要先按 Ctrl + 停止該過程 z。

$ sleep 10
^Z
[1]+  Stopped              sleep 10

$ bg %1
[1]+ sleep 10 &

由於某些程式設計師的懶惰,如果只有一個程序,或者對於列表中的第一個程序,所有這些命令也可以使用單個%。例如:

$ sleep 10 &
[1] 20024

$ fg %        # to bring a process to foreground 'fg %' is also working.
sleep 10

要不就

$ %           # laziness knows no boundaries, '%' is also working.
sleep 10

此外,只需鍵入 fgbg 而不需要任何引數即可處理上一個作業:

$ sleep 20 &
$ sleep 10 &
$ fg
sleep 10
^C
$ fg
sleep 20

殺死正在執行的工作

$ sleep 10 &
[1] 20024

$ kill %1
[1]+  Terminated              sleep 10

睡眠過程在後臺執行,程序 ID 為(pid)20024,作業號為 1。要引用該過程,你可以使用 pid 或作業號。如果你使用作業編號,則必須在其前面新增%kill 傳送的預設 kill 訊號是 SIGTERM,它允許目標程序正常退出。

一些常見的殺傷訊號如下所示。要檢視完整列表,請執行 kill -l

訊號名稱 訊號值 影響
SIGHUP 1 結束通話
SIGINT 2 鍵盤中斷
SIGKILL 9 殺死訊號
SIGTERM 15 終止訊號

啟動並終止特定程序

殺死正在執行的程序的最簡單方法可能是通過程序名稱選擇它,如下例所示,使用 pkill 命令

pkill -f test.py

(或)使用 pgrep 搜尋實際程序 ID 的更簡單方法

kill $(pgrep -f 'python test.py')

使用 grep over ps -ef | grep name_of_process 可以獲得相同的結果,然後殺死與得到的 pid 相關的過程(程序 id)。在測試環境中使用其名稱選擇程序非常方便,但在生產中使用指令碼時可能非常危險:實際上不可能確定名稱是否與你實際想要殺死的程序相匹配。在這些情況下,以下方法實際上是安全的。

使用以下方法啟動最終將終止的指令碼。讓我們假設你要執行並最終殺死的命令是 python test.py

#!/bin/bash

if [[ ! -e /tmp/test.py.pid ]]; then   # Check if the file already exists
    python test.py &                   #+and if so do not run another process.
    echo $! > /tmp/test.py.pid
else
    echo -n "ERROR: The process is already running with pid "
    cat /tmp/test.py.pid
    echo
fi

這將在/tmp 目錄中建立一個包含 python test.py 程序的 pid 的檔案。如果檔案已存在,我們假設該命令已在執行且指令碼返回錯誤。

然後,當你想殺死它時,使用以下指令碼:

#!/bin/bash

if [[ -e /tmp/test.py.pid ]]; then   # If the file do not exists, then the
    kill `cat /tmp/test.py.pid`      #+the process is not running. Useless
    rm /tmp/test.py.pid              #+trying to kill it.
else
    echo "test.py is not running"
fi

這將完全殺死與你的命令關聯的程序,而不依賴於任何易失性資訊(如用於執行命令的字串)。即使在這種情況下,如果檔案不存在,指令碼也會假定你要終止未執行的程序。

最後一個示例可以輕鬆改進,以便多次執行相同的命令(例如,附加到 pid 檔案而不是覆蓋它),並管理程序在被殺死之前死亡的情況。