我從shell腳本啓動了一個後臺進程,我想在腳本結束後終止該進程。 shell
如何從個人shell腳本中獲取此過程的PID? 據我所見變量$!
包含當前腳本的PID,而不是後臺進程。 bash
您也許還能夠使用pstree: spa
pstree -p user
一般,這會爲「用戶」提供全部進程的文本表示形式,而-p選項會給出進程ID。 據我瞭解,它並不依賴於當前Shell擁有進程。 它還顯示了叉子。 code
這就是我所作的。 檢查一下,但願對您有所幫助。 進程
#!/bin/bash # # So something to show. echo "UNO" > UNO.txt echo "DOS" > DOS.txt # # Initialize Pid List dPidLst="" # # Generate background processes tail -f UNO.txt& dPidLst="$dPidLst $!" tail -f DOS.txt& dPidLst="$dPidLst $!" # # Report process IDs echo PID=$$ echo dPidLst=$dPidLst # # Show process on current shell ps -f # # Start killing background processes from list for dPid in $dPidLst do echo killing $dPid. Process is still there. ps | grep $dPid kill $dPid ps | grep $dPid echo Just ran "'"ps"'" command, $dPid must not show again. done
而後只需以適當的權限將其運行爲: ./bgkill.sh
it
root@umsstd22 [P]:~# ./bgkill.sh PID=23757 dPidLst= 23758 23759 UNO DOS UID PID PPID C STIME TTY TIME CMD root 3937 3935 0 11:07 pts/5 00:00:00 -bash root 23757 3937 0 11:55 pts/5 00:00:00 /bin/bash ./bgkill.sh root 23758 23757 0 11:55 pts/5 00:00:00 tail -f UNO.txt root 23759 23757 0 11:55 pts/5 00:00:00 tail -f DOS.txt root 23760 23757 0 11:55 pts/5 00:00:00 ps -f killing 23758. Process is still there. 23758 pts/5 00:00:00 tail ./bgkill.sh: line 24: 23758 Terminated tail -f UNO.txt Just ran 'ps' command, 23758 must not show again. killing 23759. Process is still there. 23759 pts/5 00:00:00 tail ./bgkill.sh: line 24: 23759 Terminated tail -f DOS.txt Just ran 'ps' command, 23759 must not show again. root@umsstd22 [P]:~# ps -f UID PID PPID C STIME TTY TIME CMD root 3937 3935 0 11:07 pts/5 00:00:00 -bash root 24200 3937 0 11:56 pts/5 00:00:00 ps -f
pgrep
能夠爲您獲取父進程的全部子PID。 如前所述, $$
是當前腳本的PID。 所以,若是您但願腳本在執行後自行清理,則能夠作到這一點: 後臺
trap 'kill $( pgrep -P $$ | tr "\n" " " )' SIGINT SIGTERM EXIT
您能夠使用jobs -l
命令轉到特定的jobL 變量
^Z [1]+ Stopped guard my_mac:workspace r$ jobs -l [1]+ 46841 Suspended: 18 guard
在這種狀況下,46841是PID。 List
來自help jobs
: 權限
-l報告做業的進程組ID和工做目錄。
jobs -p
是另外一個僅顯示PID的選項。
$$
是當前腳本的pid $!
是最後一個後臺進程的pid 下面是一個bash會話樣本成績單( %1
是指後臺進程的序號從看到jobs
):
$ echo $$ 3748 $ sleep 100 & [1] 192 $ echo $! 192 $ kill %1 [1]+ Terminated sleep 100