Мне нужно запустить три процесса через мой PHP-скрипт. Эти процессы живут в /home/user/server
каталог с именем server-one
, server-two
а также server-three
, Процесс также способен принимать команды через свои консоли, поэтому мне нужно, чтобы они жили на своем собственном экране с именем, чтобы я мог использовать -X stuff
дать им команды. Кроме того, каждый из процессов выдает информацию о состоянии и отладочную информацию через stdout на своих консолях, поэтому я хочу зарегистрировать вывод для отображения на случай, если мне когда-нибудь понадобится проверить процесс и какая последняя отладка была через мою консоль
Итак, другими словами, мне нужно запустить процесс на именованном экране, вывести журнал информации консоли stdout в файл, а также иметь возможность отправлять команды непосредственно на экран, если мне это нужно.
У меня есть PHP все ниже, в одном файле:
<?php
exec('screen -dmS server-one');
$serverPath = "/home/user/server";
$oneOut = "/var/www/log/server-one.log";
$serverOneExec = "server-one";
exec(sprintf("screen -S server-one -X stuff $'cd %s\n'", $serverPath));
exec(sprintf("screen -S server-one -X stuff $'./%s > %s\n'", $serverOneExec, $oneOut));
$screentwo = "screen -dmS server-two";
exec($screentwo);
$twoOut = "/var/www/log/server-two.log";
$serverTwoExec = "server-two";
exec(sprintf("screen -S server-two -X stuff $'cd %s\n'", $serverPath));
exec(sprintf("screen -S server-two -X stuff $'./%s > %s\n'", $serverTwoExec, $twoOut));
$screenthree = "screen -dmS server-three";
exec($screenthree);
$threeOut = "/var/www/log/server-three.log";
$serverThreeExec = "server-three";
exec(sprintf("screen -S server-three -X stuff $'cd %s\n'", $serverPath));
exec(sprintf("screen -S server-three -X stuff $'./%s > %s\n'", $serverThreeExec, $threeOut));
?>
Все экраны созданы правильно, но серверы не запущены. В качестве теста отладки я изменил все команды exec, чтобы отобразить то, что sprintf передает exec, и это определенно правильно. В качестве теста я запускал команды в SSH, и они выполнялись правильно и дали желаемый эффект, так что в выводимой команде нет ничего, что могло бы вызвать проблемы.
Все права доступа к исполняемым файлам и журналам являются правильными при создании файлов журнала, но файл журнала не заполнен чем-либо, он пуст. Я не могу получить доступ к экранам напрямую, так как пользователь, где работает php, является www-данными, и вы не можете войти в www-данные через SSH. Если я запускаю сервер через веб-браузер без экрана и просто выбрасываю процесс в фоновый режим, он работает правильно, поэтому здесь тоже не возникает проблема с разрешениями, но мне нужно, чтобы эти процессы были на экране, чтобы я мог управлять ими позже через их приставки.
Я что-то здесь упускаю?
Я решил это, удалив $''
вокруг команды для отправки на экран и вместо этого используется \"\"
с \n
в окружении клещей.
Так, например, изменилось:
exec(sprintf("screen -S server-three -X stuff $'./%s > %s\n'", $serverThreeExec, $threeOut));
…к ….
exec(sprintf("screen -S server-three -X stuff \"./%s > %s\"'\n'", $serverThreeExec, $threeOut));
И теперь это работает.
Других решений пока нет …