Как я могу получить PID PHP-скрипта, запущенного в качестве первой команды в конвейере?

У меня есть такая команда:

php myscript.php |
curl -X POST --data-binary @- "http://localhost/webservice.php/$$/output/"

я использую | отправить вывод myscript.php к curl команда. я использую $$ чтобы получить PID, но это возвращает PID curl команда, а не php команда.

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

Поэтому в myscript.php я вызываю (1 — идентификатор cronjob):

file_get_contents('http://localhost/webservice.php/1/' . getmypid() . '/start/');
...
file_get_contents('http://localhost/webservice.php/1/' . getmypid() . '/end/');

Я пытаюсь отправить выходные данные myscript.php на веб-сервис, который я создаю.

Поэтому я отправляю команды начала / окончания на мой веб-сервис. Я пропускаю только одно: вывод PHP, если есть предупреждения или какое-то «эхо».

Цель состоит в том, чтобы перенаправить вывод скрипта (который также может быть скриптом bash) в веб-сервис, используя PID команды PHP (которую я использую для идентификации процесса в моем веб-сервисе).

Как я могу получить PID команды PHP? Я пробовал $$, как нашел в Stackoverflow, но, как вы ответили, похоже, что это текущий PID оболочки …

Спасибо заранее!

1

Решение

TL; DR

$$ Переменная является специальной переменной. Он возвращает PID вызывающей оболочки, который может не совпадать с PID текущей оболочки, хранящейся в $ BASHPID. Ни одна из переменных не имеет никакого отношения к PID из процессов в вашем конвейере. Руководство по Bash говорит:

($$) Расширяется до идентификатора процесса оболочки. В подоболочке () она расширяется до идентификатора процесса вызывающей оболочки, а не подоболочки.

Вам нужно реорганизовать ваш PHP-скрипт и ваш конвейер, чтобы сделать что-то другое.

Правильно создавайте уникальные каталоги

Вы не объяснили, что на самом деле делает ваш PHP-скрипт, так что это похоже на проблему X / Y. В общем, вы должны использовать Mktemp или его эквиваленты PHP:

создавать временные или уникальные имена файлов. Поскольку вы, похоже, хотите использовать уникальные каталоги, я приведу это в качестве примера ниже. Тем не менее, может быть чище иметь один каталог, содержащий имена файлов, которые гарантированно будут уникальными. Ваш пробег может отличаться.

Вместо того, чтобы пытаться использовать PID, вы должны использовать Mktemp Утилита для создания уникальных каталогов или имен файлов без условий гонки. Если вы делаете это в Bash, вы можете экспортировать переменную в среду, а затем использовать ту же директорию внутри вашего PHP-скрипта. Например:

#!/usr/bin/env bash

# Create a unique temp directory safely.
export DIR=$(mktemp -d)

# Create your output directory for whatever reason.
mkdir "$DIR/output"
# Ensure PHP uses $_ENV["DIR"] to do whatever it's doing.
php myscript.php | curl -X POST --data-binary @- "file://$DIR/output/"
# Clean up the temp directory at some point.
echo "I did something with '$DIR' so clean it up later." > /dev/stderr

Просто используйте уникальные файлы с префиксами

Вместо использования каталогов, вы можете также рассмотреть возможность использования уникальных имен файлов с определенным префиксом. Например:

# Create files like "/tmp/myscript.D6147vts"export TEMPFILE=$(mktemp -t myscript)

Затем, как и раньше, используйте $_ENV["TEMPFILE"] в вашем скрипте PHP. Преимущество этого подхода заключается в том, что ваши имена файлов гарантированно будут уникальными, но все они в одном месте и имеют общий префикс. Это может сделать очистку или поиск нужного файла намного проще в дальнейшем.

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

1

Другие решения

Пытаться
ps aux | grep «идентификатор процесса» и pid, если второй столбец. Разобрать его с помощью pnp_exec; то есть, сохранить его в массиве и извлечь номер PID.

0

По вопросам рекламы [email protected]