it-swarm.com.ru

Как получить текущий идентификатор процесса Linux из командной строки a в независимой от языка, не зависящей от языка форме

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

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

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

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

22
Johnny Utahh

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

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

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

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

2
Johnny Utahh

Из питона:

$ python
>>> import os
>>> os.getpid()
12252
54
Aleksandr Levchuk

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

8
duskwuff

Надеюсь, что это достаточно переносимо, так как 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 командной оболочки выполнял сценарий, а не интерактивный.

7
millimoose

Меньше персонажей и гарантированно работают:

sh -c 'echo $PPID'
1
Jordan Samuels

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

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

0
stew