Как получить PID фонового процесса?
Я запускаю фоновый процесс из моего сценария оболочки, и я хотел бы убить этот процесс, когда мой сценарий закончится.
Как получить PID этого процесса из моего сценария оболочки? Насколько я вижу переменная $! содержит PID текущего скрипта, а не фоновый процесс.
7 ответов:
вам нужно сохранить PID фонового процесса в момент его запуска:
foo & FOO_PID=$! # do other stuff kill $FOO_PIDвы не можете использовать управление заданиями, так как это интерактивная функция, привязанная к управляющему терминалу. Сценарий не обязательно будет иметь терминал, подключенный вообще, поэтому управление заданиями не обязательно будет доступно.
можно использовать
jobs -lкоманда, чтобы добраться до конкретного задания^Z [1]+ Stopped guard my_mac:workspace r$ jobs -l [1]+ 46841 Suspended: 18 guardв этом случае 46841 является PID.
С
help jobs:-L сообщите идентификатор группы процессов и рабочий каталог заданий.
jobs -pэто еще один вариант, который показывает только PIDs.
$$- это pid текущего скрипта$!- это PID последнего фонового процессавот пример стенограммы из сеанса bash (
%1относится к порядковому номеру фонового процесса, как видно изjobs):$ echo $$ 3748 $ sleep 100 & [1] 192 $ echo $! 192 $ kill %1 [1]+ Terminated sleep 100
еще более простой способ убить весь дочерний процесс скрипта bash:
pkill -P $$The
-Pфлаг работает так же сpkillиpgrep- он получает дочерние процессы, только сpkillребенок процессы убивают и сpgrepдочерние PIDs печатаются в stdout.
вот что я сделал. Проверьте это, надеюсь, что это может помочь.
#!/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с соответствующими разрешениями, конечно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