Как получить 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