В дополнение к ответу @ DaveRandom: на самом деле не нужно для перенаправления STDERR
на STDOUT
(с 2>&1
).
Однако вам нужно перенаправить STDOUT
, если вы хотите предотвратить зависание родительского процесса в ожидании завершения дочернего процесса. Это необходимо, потому что exec
вернет последнюю строку вывода дочернего процесса, поэтому ему нужно дождаться закрытия дочернего элемента STDOUT
.
Это не значит, что вам нужно перенаправить его на /dev/null
. Вы можете перенаправить его в другой файл или даже в другой дескриптор файла (например, STDERR
: 1>&2
).
exec('/path/to/executable')
: запустит новый процесс и дождется его завершения (т. Е. Блокировки родительского процесса).
exec('/path/to/executable &')
: в основном то же, что и выше.
$pid = exec('/path/to/executable > /dev/null & echo $!')
: запустит процесс в фоновом режиме, когда дочерний и родительский процессы будут выполняться параллельно. Вывод /path/to/executable
будет отброшен, а $pid
получит PID дочернего процесса.
Использование 2>&1
на самом деле не является необходимым, потому что exec
игнорирует STDERR
дочернего процесса. Это также, вероятно, нежелательно, потому что будет труднее находить некоторые ошибки, потому что они будут просто тихо выброшены. Если вы опустите 2>&1
, вы можете передать STDERR
родительского процесса в какой-нибудь файл журнала, который можно проверить позже, если что-то пойдет не так:
php /path/to/script.php 2>> /var/log/script_error.log
Используя вышеописанное для запуска сценария, запускающего дочерние процессы, все, что script.php
и любого дочернего процесса, записывающего в STDERR
, будет записано в файл журнала.