Linux — PHP с использованием Exec с экрана

Мне нужно запустить три процесса через мой 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. Если я запускаю сервер через веб-браузер без экрана и просто выбрасываю процесс в фоновый режим, он работает правильно, поэтому здесь тоже не возникает проблема с разрешениями, но мне нужно, чтобы эти процессы были на экране, чтобы я мог управлять ими позже через их приставки.

Я что-то здесь упускаю?

1

Решение

Я решил это, удалив $'' вокруг команды для отправки на экран и вместо этого используется \"\" с \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));

И теперь это работает.

2

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

Других решений пока нет …

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