Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

(Не уверен, насколько уместным/полезным он должен быть связан с независимостью от оболочки, но просто испытывал много раз ограничение "run system call without shell", которое теперь, когда это возможно, ищет независимые от оболочки параметры.)

Ответ 2

Из python:

$ python
>>> import os
>>> os.getpid()
12252

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

sh -c 'echo $PPID'