Tengo un servidor web Apache en mi RaspberryPi 4 que tiene un programa escrito en Python que activará una matriz de 8x8 de LED rojos. Tengo una página HTML y PHP en el servidor web para poder ejecutar ese script de forma remota. El HTML es solo 2 botones y al presionar el botón va a este programa 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; } ?>Este programa PHP solo reconoce cuál de los 2 botones se presionó y, al presionarlo, ejecuta una función. Para la función lightOn() es simple, ya que solo ejecuto el script que controla la matriz de LED de 8x8. Sin embargo, quiero que el usuario pueda detener el script en cualquier momento presionando el otro botón. En una interfaz de línea de comando normal, escribiría 'Control + c' para detener cualquier script en ejecución. ¿Cómo lograría eso en PHP a través de shell_exec o cualquier otro método?
En su servidor, descubra cuál es la identificación del proceso (PID) a través de los comandos ps , top o incluso htop . Entonces puedes matarlo con el comando kill {pid_number} .
Algo como:
$ ps aux | grep led_display # the first number that appears is the PID. let's assume it's 1234 $ kill 1234Suponiendo que tiene control sobre el archivo sudoers y sabe cómo hacerlo para que el proceso de su servidor web pueda ejecutar el comando al que se hace referencia en lightOff sin una contraseña, debería poder hacerlo
$command = escapeshellcmd('sudo pkill -TERM led_display.py'); Por supuesto, eso terminaría CUALQUIER proceso llamado led_display.py , no solo el que inició desde el proceso del servidor web.
EDITAR:
¿Qué sucede si pones en segundo plano el proceso?
$command = escapeshellcmd('sudo python3 led_display.py > /dev/null 2>&1 &');