Я пытаюсь запустить скрипт из PHP на моем сервере.
<?php exec("sh /var/www/scripts/script.sh", $output); ?>
мой сценарий:
#!/bin/bash
sh Stop.sh
nohup java -jar RestApiRandonSender.jar& # You send it in background
MyPID=$! # You sign it's PID
echo $MyPID # You print to terminal
echo "kill -9 $MyPID" > Stop.sh
echo "rm Stop.sh" >> Stop.sh
Моя структура папок:
/var/www/
/html/restart.php
/scripts/script.sh
все группы и пользователи root
,
Когда я получаю доступ к странице PHP из Chrome (localhost/restart.php
), Ничего не произошло.
Но когда я в папке скриптов и запускаю
sudo php ../html/restart.php
сценарии перезапускают файл jar и создают Stop.sh
, но сценарий не заканчивается, пока я не нажму Ctrl + c или Ctrl + z.
Я новичок в Linux. Я надеюсь, что дал все необходимые детали ..
РЕДАКТИРОВАТЬ:
Я изменил путь к полному пути к файлу в script.sh
и сейчас это почти работает.
Процесс еще никогда не заканчивается.
Веб-страница из Chrome ожидает ответа, а идентификатор процесса в файле jar полностью отличается от идентификатора процесса, который я получаю в Stop.sh
$ ps -ef | grep java
apache 10086 1 76 11:23 ? 00:05:00 java -jar /var/www/scripts/RestApiRandonSender.jar
Ваша текущая проблема, вероятно, основана на том, что вы вообще не имеете дело с каталогами: rm
как и большинство команд Unix-esque, работает из текущего каталога, если ни один не указан. Когда вы запускаете из другого каталога, вызывая ../html/restart.php
будет пытаться запустить Stop.sh
Сценарий в текущем каталоге, сбой (вероятно, в молчании — вы должны это исправить), а затем продолжить запуск нового сервера Java, что я подозреваю, если вы изучите его журналы (вы это сделали?) будут постоянно зависать, пытаясь привязаться к порту TCP, что невозможно, потому что другой процесс все еще жив.
В вашем Bash-скрипте вам нужно указать, где найти / создать скрипт Stop. Вы должны либо:
/var/run/blah...)
к Stop.sh
сценарий в вашем сценарии,dirname $0
чтобы найти это в Баш.PID
процесса. Это эффективно то, что большинство сервис-менеджеров в любом случае делают. Ты просто пишешь MyPID
, в вашем случае, в файл, а затем выполните это:Объединяя элементы двух последних, вы можете попробовать (не проверено):
#!/bin/bash
PIDFILE=$(dirname $0)/PID # Read the current PID, if any
pid=$(cat $PIDFILE) && kill -9 pid # Kill it off if it's there
nohup java -jar RestApiRandonSender.jar &
pid=$!
echo $pid > $PIDFILE # Write the new PID to the file
Другие проблемы с вашей настройкой, чтобы думать о:
root
если вы можете избежать этого, для безопасности. По крайней мере, настроен sudo
привилегии для самого ограниченного набора вещей, которые вам нужно сделать.Других решений пока нет …