Как получить текущий идентификатор процесса Linux из командной строки a независимо от языка и языка - PullRequest
25 голосов
/ 27 ноября 2011

Как можно получить их текущий идентификатор процесса (pid) из командной строки Linux независимым от оболочки способом, не зависящим от языка?

pidof(8), по-видимому, не имеет возможности получить вызывающий процесс 'pid. Bash, конечно, имеет $$ - но для моего общего использования я не могу полагаться на оболочку (Bash или иным образом). А в некоторых случаях я не могу написать скрипт или скомпилируемую программу, поэтому Bash / Python / C / C ++ (и т. Д.) Не будут работать.

Вот конкретный вариант использования: я хочу получить pid запущенного, Python-Fabric удаленного процесса SSH на основе (где можно избежать предположения, что bash работает), поэтому что среди прочего я могу копировать и / или создавать файлы и / или каталоги с уникальными именами файлов (как в mkdir /tmp/mydir.$$).

Если мы сможем решить специфическую для Fabric проблему, это будет полезно, но это не решит мою долгосрочную проблему. Для общего использования во всех будущих сценариях я просто хочу команду, которая возвращает то, что $$ предоставляет в Bash.

Ответы [ 6 ]

61 голосов
/ 22 апреля 2013

Из питона:

$ python
>>> import os
>>> os.getpid()
12252
8 голосов
/ 27 ноября 2011

$$ не зависит от bash - я полагаю, что он доступен во всех POSIX-совместимых оболочках, то есть практически во всех оболочках, которые не являются преднамеренно странными.

7 голосов
/ 27 ноября 2011

Надеюсь, что это достаточно переносимо, так как PPID является четвертым полем /proc/[pid]/stat:

cut -d ' ' -f 4 /proc/self/stat

Предполагается, что Linux имеет правильную форму /proc, что макет /proc/[pid]/stat не будет несовместимо отличаться от того, что есть в Debian 6.0.1, что cut - это отдельный исполняемый файл, а не встроенная оболочка, и это сокращение не порождает подпроцессы.

В качестве альтернативы выможно получить поле 6 вместо поля 4, чтобы получить PID «лидера сеанса» .Интерактивные оболочки, по-видимому, устанавливают себя лидерами сеансов, и этот идентификатор должен оставаться неизменным для всех каналов и вызовов подоболочек:

$ echo $(echo $( cut -f 6 -d ' ' /proc/self/stat ) )
23755

$ echo $(echo $( cut -f 4 -d ' ' /proc/self/stat ) )
24027

$ echo $$
23755 

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

2 голосов
/ 28 ноября 2011

Отличные ответы + комментарии здесь и здесь . Спасибо всем. Объединение обоих в один ответ, предоставляя два варианта с компромиссами в контекстах, необходимых для POSIX-shell, и контекстов, не требующих POSIX-shell:

  1. Доступна оболочка POSIX: используйте $$
  2. Общая команда: наймите cut -d ' ' -f 4 /proc/self/stat

Пример сеанса с обоими методами (наряду с другими предлагаемыми, нерабочими методами) показан здесь .

(Не уверен, насколько уместно / полезно так беспокоиться о том, чтобы быть независимым от оболочки, но он просто много раз испытывал ограничение «запускать системный вызов без оболочки», которое теперь ищет варианты, не зависящие от оболочки.)

0 голосов
/ 29 июля 2016

Меньше символов и гарантированно работают:

sh -c 'echo $PPID'
0 голосов
/ 27 ноября 2011

Если у вас есть доступ к файловой системе proc, то / proc / self является символической ссылкой на текущий / proc / $ pid.Вы можете прочитать pid, например, из первого столбца /proc/self/stat.

Если вы находитесь в python, вы можете использовать os.getpid ().

...