Если у меня есть сценарий Python, который я запустил в PHP с веб-сервера, как мне его остановить? - PullRequest
0 голосов
/ 26 апреля 2020

У меня на RaspberryPi 4 есть веб-сервер Apache, на котором написана программа, написанная на Python, которая включает матрицу красных светодиодов 8x8. У меня есть страница HTML и PHP на веб-сервере, поэтому я могу удаленно выполнить этот скрипт. HTML - это всего лишь 2 кнопки, и при нажатии кнопки происходит переход к этой программе PHP:

<?php

  ini_set('display_errors', 1);
  ini_set('display_startup_errors', 1);
  error_reporting(E_ALL);

  if ($_SERVER['REQUEST_METHOD'] == "POST" and isset($_POST['on']))
  {
    lightOn();
  } elseif ($_SERVER['REQUEST_METHOD'] == "POST" and isset($_POST['off']))
  {
    lightOff();
  }

  function lightOn()
  {
    $command = escapeshellcmd('sudo python3 led_display.py');
    $output = shell_exec($command);

    header('Location: index.html');
    exit;

  }

  function lightOff()
  {
    $command = escapeshellcmd('');
    $output = shell_exec($command);

    header('Location: index.html');
    exit;
  }

?>

Эта программа PHP просто распознает, какая из 2 кнопок была нажата и пресс выполняет функцию. Для функции lightOn () это просто, поскольку я просто выполняю скрипт, который управляет светодиодной матрицей 8x8. Однако я хочу, чтобы пользователь мог в любой момент остановить скрипт, нажав другую кнопку. В обычном интерфейсе командной строки я бы набрал 'Control + c', чтобы остановить любой запущенный скрипт. Как мне добиться этого в PHP через shell_exe c или любым другим способом?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Предполагая, что у вас есть контроль над файлом sudoers и вы знаете, как его сделать, чтобы процесс веб-сервера мог выполнить команду, указанную в lightOff, без пароля, вы должны уметь

$command = escapeshellcmd('sudo pkill -TERM led_display.py');

Конечно, это завершит ЛЮБОЙ процесс, называемый led_display.py, а не только тот, который вы запустили из процесса веб-сервера.

РЕДАКТИРОВАТЬ:

Что произойдет, если вы справитесь с процессом?

$command = escapeshellcmd('sudo python3 led_display.py > /dev/null 2>&1 &');
0 голосов
/ 26 апреля 2020

На вашем сервере узнайте, что такое идентификатор процесса (PID), с помощью команд ps, top или даже htop. Чем вы можете убить его с помощью команды kill {pid_number}.

Что-то вроде:

$ ps aux | grep led_display # the first number that appears is the PID. let's assume it's 1234
$ kill 1234
...