Как получить PID фонового процесса?

Я запускаю фоновый процесс со своего сценария оболочки, и я хотел бы уничтожить этот процесс, когда мой сценарий заканчивается.

Как получить PID этого процесса из моего сценария оболочки? Насколько я вижу переменную $! содержит PID текущего сценария, не фоновый процесс.

349
задан Matthieu 16 January 2019 в 03:29
поделиться

3 ответа

Вам необходимо сохранить PID фонового процесса в момент его запуска:

foo &
FOO_PID=$!
# do other stuff
kill $FOO_PID

Вы не можете использовать управление заданиями, так как это интерактивная функция, привязанная к управляющему терминалу. К сценарию совсем не обязательно должен быть подключен терминал, поэтому управление заданиями не обязательно будет доступно.

532
ответ дан 23 November 2019 в 00:26
поделиться

Вы можете использовать команду jobs -l , чтобы перейти к конкретному заданиюL

^Z
[1]+  Stopped                 guard

my_mac:workspace r$ jobs -l
[1]+ 46841 Suspended: 18           guard

В этом случае 46841 - это PID.

From help jobs :

-l Сообщает идентификатор группы процессов и рабочий каталог заданий.

jobs -p - еще одна опция, которая показывает только PID.

134
ответ дан 23 November 2019 в 00:26
поделиться
  • $$ - это pid текущего скрипта
  • $! - это pid последнего фонового процесса

Вот пример записи из сеанса bash (% 1 относится к порядковому номеру фонового процесса, как видно из заданий ):

$ echo $$
3748

$ sleep 100 &
[1] 192

$ echo $!
192

$ kill %1

[1]+  Terminated              sleep 100
45
ответ дан 23 November 2019 в 00:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: