工作處理
創造就業機會
要建立作業,只需在命令後附加一個 &
:
$ 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
此外,只需鍵入 fg
或 bg
而不需要任何引數即可處理上一個作業:
$ 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 檔案而不是覆蓋它),並管理程序在被殺死之前死亡的情況。