linux — выполнить скрипт bash из php для запуска jar

Я пытаюсь запустить скрипт из 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

0

Решение

Ваша текущая проблема, вероятно, основана на том, что вы вообще не имеете дело с каталогами: rmкак и большинство команд Unix-esque, работает из текущего каталога, если ни один не указан. Когда вы запускаете из другого каталога, вызывая ../html/restart.phpбудет пытаться запустить Stop.sh Сценарий в текущем каталоге, сбой (вероятно, в молчании — вы должны это исправить), а затем продолжить запуск нового сервера Java, что я подозреваю, если вы изучите его журналы (вы это сделали?) будут постоянно зависать, пытаясь привязаться к порту TCP, что невозможно, потому что другой процесс все еще жив.

В вашем Bash-скрипте вам нужно указать, где найти / создать скрипт Stop. Вы должны либо:

  1. жестко закодировать каталог (например, /var/run/blah...) к Stop.sh сценарий в вашем сценарии,
  2. или сделать это относительно скрипта директор — вы можете использовать dirname $0 чтобы найти это в Баш.
  3. или не переписывать скрипт каждый раз, просто переписать 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 привилегии для самого ограниченного набора вещей, которые вам нужно сделать.
  • параллелизм (что происходит, когда несколько человек запускают этот скрипт (URL) одновременно?). Вы можете избежать неприятностей с этим, так как обычно это сложная проблема.
  • Что происходит при перезагрузке самого сервера. Я предлагаю, в долгосрочной перспективе, вы посмотрите на создание службы Linux на вашем Java-сервере — смотрите Linux: процесс в сервис для некоторых примеров. Это также касается предыдущего пункта …
0

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

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

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