PID дочернего процесса bash (imapsync) - как его получить?

15

Может ли кто-нибудь сказать мне, как получить PID команды, выполняемой в Bash.

Например, у меня есть скрипт bash, который запускает imapsync.

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

Итак, как мне программно получить PID дочернего процесса из родительского сценария bash?

Джейсон Тан
источник
1
Как насчет "pidof imapsync"? Что с этим не так?
Питр
2
Я не знал о пидоф. Однако, теперь, когда я это делаю, это бесполезно для этого сценария, насколько я могу судить, потому что pidof, похоже, возвращает все процессы данной команды в системе - даже те, которые принадлежат другим скриптам / пользователям. Кроме того, imapsync на самом деле является сценарием perl, поэтому я хотел бы сделать pidof perl, который, скорее всего, вернет процессы, которые не являются imapsync и могут принадлежать другим пользователям.
Джейсон Тан
Хавьер прав. Эта страница предложит больше информации относительно ProcessManagement .
Синпин

Ответы:

4

imapsync имеет возможность установить, где написан его pid:

--pidfile: файл, в который записан pid imapsync.

Жиль ЛАМИРАЛ
источник
К вашему сведению, это не совсем отвечает на мой вопрос в общем смысле, но я обнаружил аргумент --pidfile, и с некоторыми недоразумениями он был достаточно хорош ..
Джейсон Тан,
@JasonTan Зачем учить человека ловить рыбу, если ты можешь дать ему вкусное предварительно приготовленное филе, чтобы он вернулся и мучил тебя больше, завтра, а? извините за старый пост, но зачем принимать этот ответ вместо ответа Хавьера?
несинхронизировано
46
any_command args &
my_child_PID=$!

IOW, как и $$ваш PID, $!имеет PID последней выполненной фоновой команды .

Хавьер
источник
Спасибо, но imapsync не является фоновым и $! не устанавливается, если я отображаю его на следующей строке после вызова imapsync или в первой строке обработчика сигнала. :-(
Джейсон Тан
6
если он разветвляет ребенка, то ответственность за сохранение PID ребенка лежит на нем. обычная практика это сохранение где-то вроде /var/run/whatever.pid. Может быть, есть опция командной строки, чтобы попросить ее сохранить PID где-нибудь; если нет, то это звучит как возможность спросить автора или реализовать себя.
Хавьер
1
Акцент на фоне . Если ни один процесс не был помещен в фон (то есть, с добавленным &), тогда $!переменная не определена.
Тревор
1
Более похожие решения предлагаются в (ответ на) Как получить pid только что запущенного процесса ; в качестве дополнения к этому ответу в комментарии там говорится: ой, а "oneliner": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- sysfault 24 ноября 2010 года в 14:28
imz - Иван Захарящев
10

В отличие от этого pidof, pgrepможет быть предоставлено множество опций для ограничения того, для каких процессов он возвращает PID. Один из них, который может быть особенно полезным, - это выбор на основе PPID с использованием PID текущего процесса.

pgrep -P $$ imapsync

который будет выводить только PID imapsync, если они являются дочерними элементами вашего скрипта.

Приостановлено до дальнейшего уведомления.
источник
0

Как насчет того, чтобы на мгновение поставить imapsync на задний план, получить PID и затем установить приоритет ... Что-то вроде этого:

imapsync &
pid=$!
wait $pid
retVal=$?
отметка
источник