Foros del Web » Programando para Internet » PHP »

Arrancar proceso en linux usando PHP

Estas en el tema de Arrancar proceso en linux usando PHP en el foro de PHP en Foros del Web. Hola a todos, estoy con el proyecto fin de carrera que es un portal web de VOD, y bueno tengo ya muchas cosas hechas pero ...
  #1 (permalink)  
Antiguo 10/10/2010, 14:26
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 7
Antigüedad: 13 años, 6 meses
Puntos: 0
Exclamación Arrancar proceso en linux usando PHP

Hola a todos, estoy con el proyecto fin de carrera que es un portal web de VOD, y bueno tengo ya muchas cosas hechas pero me he quedado atascado en algo que daba por sentado que no iba a darme problemas. Es arrancar el dichoso VLC (videolan) en mi maquina linux desde PHP. Se supone que para arrancar dicho reproductor se hace con el comado:

vlc --ttl 12 -vvv --color -I telnet --telnet-password videolan --rtsp-host localhost:5554

esto lo he metido en un fichero llamado iniciar_serv.sh.
Si lo ejecutas, el reproductor se arranca pero este no retorna nada, dado que se queda mostrando lo siguiente y no admite mas comandos:

ity 0 (interface/interface.c:231)
[00000287] main interface debug: looking for interface module: 6 candidates
[00000287] main interface: creating VLM
[00000289] main vlm debug: thread 3038579600 (vlm thread) created at priority 0 (misc/vlm.c:105)
[00000287] telnet interface: using the VLM interface plugin...
[00000287] main interface debug: net: listening to port 4212
[00000287] telnet interface: telnet interface started on interface 4212
[00000287] main interface debug: using interface module "telnet"
[00000287] main interface debug: thread 3030186896 (manager) created at priority 0 (interface/interface.c:216)

SOLUCION que di fue crear otro script que ejecuta esto con un nohup y & para que lo haga segundo plano que lo llame arrancar.sh.

nohup ./iniciar_serv.sh &

PROBLEMA:

Si ejecuto inciar_serv.sh desde php con lo siguiente:

exec = ('/scripts/iniciar_serv')

La pagina se queda esperando a que el script retorne algo, cosa que no sucede proque se queda colgado.

Si hago lo mismo pero con arrancar.h

exec = ('/scripts/arrancar.sh')


La pagina finaliza pero no arranca el reproductor.

PREGUNTA

¿Hay alguna forma de controlar en php que si el servidor tarda mucho en responder salga directamente de la ejecucion del comando?
Si consiguiera esto conseguiria que se ejcutara mi script y se continuar con la ejecucion normal del resto de la pagina en vez de quedarse colgado esperando una respuesta que nunca va a recibir





Muchas gracias de antemano a todos.
  #2 (permalink)  
Antiguo 10/10/2010, 17:46
Avatar de dreamconception  
Fecha de Ingreso: octubre-2010
Ubicación: Mexico-Dinamarca
Mensajes: 22
Antigüedad: 13 años, 6 meses
Puntos: 2
Respuesta: Arrancar proceso en linux usando PHP

Ver http://www.php.net/manual/en/function.exec.php

El commentario;
Cita:
[NOTE BY danbrown AT php DOT net: The following is a Linux script that the contributor of this note suggests be placed in a file named 'pstools.inc.php' to execute a process, check if a process exists, and kill a process by ID. Inspired by the Windows version at http://php.net/exec#59428 ]

Código PHP:
Ver original
  1. <?php
  2.   function PsExecute($command, $timeout = 60, $sleep = 2) {
  3.         // First, execute the process, get the process ID
  4.  
  5.         $pid = PsExec($command);
  6.  
  7.         if( $pid === false )
  8.             return false;
  9.  
  10.         $cur = 0;
  11.         // Second, loop for $timeout seconds checking if process is running
  12.         while( $cur < $timeout ) {
  13.             sleep($sleep);
  14.             $cur += $sleep;
  15.             // If process is no longer running, return true;
  16.  
  17.            echo "\n ---- $cur ------ \n";
  18.  
  19.             if( !PsExists($pid) )
  20.                 return true; // Process must have exited, success!
  21.         }
  22.  
  23.         // If process is still running after timeout, kill the process and return false
  24.         PsKill($pid);
  25.         return false;
  26.     }
  27.  
  28.     function PsExec($commandJob) {
  29.  
  30.         $command = $commandJob.' > /dev/null 2>&1 & echo $!';
  31.         exec($command ,$op);
  32.         $pid = (int)$op[0];
  33.  
  34.         if($pid!="") return $pid;
  35.  
  36.         return false;
  37.     }
  38.  
  39.     function PsExists($pid) {
  40.  
  41.         exec("ps ax | grep $pid 2>&1", $output);
  42.  
  43.         while( list(,$row) = each($output) ) {
  44.  
  45.                 $row_array = explode(" ", $row);
  46.                 $check_pid = $row_array[0];
  47.  
  48.                 if($pid == $check_pid) {
  49.                         return true;
  50.                 }
  51.  
  52.         }
  53.  
  54.         return false;
  55.     }
  56.  
  57.     function PsKill($pid) {
  58.         exec("kill -9 $pid", $output);
  59.     }
  60. ?>
Utilizes un timeout, y kill la ejecucion cuando el tiempo de espera se ha alcanzado.

Es eso lo que tu necesites?
  #3 (permalink)  
Antiguo 17/11/2010, 08:36
 
Fecha de Ingreso: mayo-2004
Ubicación: Santiago, Chile
Mensajes: 191
Antigüedad: 20 años
Puntos: 1
Respuesta: Arrancar proceso en linux usando PHP

Yo tengo un problema parecido;

Código:
echo "exec - START: ".date('i:s')."<br>";
exec("/input/test.sh /canal/2010.mov /canal/2010_123.mov");
echo "<br>END: ".date('i:s')."<br>";
Resulta que necesito copiar un archivo de unos 200 megas a otra carpeta, pero necesito SÓLO enviar la instrucción, no que la página quede detenida hasta que termine el script. ¿Es posible hacer eso? la funcion "copy" y ejecutar "cp" en exec, system, shell_exec, etc esperan tambien a que termine la ejecución de la pagina.

¿Que puedo hacer? Las copias duran hasta 30 segundo, lo que es mucho dejar esperando al usuario

Gracias!

Etiquetas: linux, proceso
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:40.