У меня есть следующий скрипт bash:
server_control_pipe="/var/custom_pipe_file_name"init_script="/usr/sbin/service [somedaemon]"
mkfifo -m 666 "$server_control_pipe"
while read line <"$server_control_pipe"do
echo "Received $line"if [[ "$line" == 'stop' ]]; then
$init_script stop
elif [[ "$line" == 'start' ]]; then
$init_script start
elif [[ "$line" == 'stoppipe' ]]; then
break
fi
echo "Waiting..."done
echo "END"
…и следующий скрипт PHP:
<?php
define('SERVER_CONTROL_PIPE', "/var/custom_pipe_file_name");
if(false === file_put_contents(SERVER_CONTROL_PIPE, "start\n", FILE_APPEND))
throw new Exception("Could not write to server control pipe");
При запуске сценария PHP цикл в сценарии bash, кажется, завершается, а сценарий bash просто выводит END.
Чтобы попытаться выяснить, почему это происходит, я заменил свой PHP-скрипт следующим кодом:
<?php
define('SERVER_CONTROL_PIPE', "/var/custom_pipe_file_name");
$f = fopen(SERVER_CONTROL_PIPE, 'w');
if(false === $f)
throw new Exception("Could not open server control pipe");
$ret = fwrite($f, 'start\n');
if(false === $ret)
throw new Exception("Could not write to server control pipe");
fclose($f);
Я обнаружил, что цикл сценария bash завершается всякий раз, когда fopen
называется.
Поэтому мой вопрос сводится к следующему: как мне открыть канал в PHP, чтобы не прерывать цикл сценария bash?
Если вы хотите, чтобы скрипт выполнялся все время, вы должны иметь значение true, а не read read, например:
while :
do
echo "Press [CTRL+C] to stop.."sleep 1
done
Если вы прочитаете строку, вы прочитаете содержимое файла в этом состоянии и закончите выполнение.
Других решений пока нет …