miguel_vor escribiste:El usuario que usa el navegador es nobody, he creado un cron para el usuario nobody pero no me permite realizar la acción de modificar el cron mediante
Using bash Syntax Highlighting
fcrontab archivo nobody
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Me aparece un error 256, que es lo que devuelve system.
256 implica que el resultado de la ejecución es un '1' por parte de
fcrontab que según su manual, es un fallo general (sin más detalles).
¿Seguro que es con fcrontab la forma en que tu sistema debes cambiar el sistema de cron? ¿No será con el comando crontab?
miguel_vor escribiste:He creado un nuevo usuario llamado failover pero no me permite crear cron. Al ejecutarlo me devuelve el siguiente error:
Using bash Syntax Highlighting
12:00:56 could not change euid to 104: Operation not permitted
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Justo: el usuario nobody no puede hacerse pasar por el usuario 104.
miguel_vor escribiste:La otra opción, la de crear un servicio que llame a un
script que se ejecute de forma indefinida cada x minutos, se queda pillado el navegador esperando al
script por tiempo indefinido, esto sucede al ejecutar la orden
Using perl Syntax Highlighting
system("failover start");
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Que según se puede ver en el código del servicio lo que hace es un
start del
script. He probado cambiando los permisos del log, pero no parece que funcione.
No se puede ejecutar un programa de forma indefinida desde el navegador web... el Apache siempre cortará la conexión pasado un tiempo.
Lo que sí puedes hacer es instalar un servicio en el sistema, en el cron del root o del usuario que quieras con tal de que tenga permisos de lectura/escritura/ejecución sobre los archivos/directorios/comandos que quieras que actúe, y que se levante cada X minutos, dejando el resultado en archivos en un directorio que sea accesible a los procesos CGI que lanzará el cliente web.
miguel_vor escribiste:Ya no sé por dónde tirar y es que no puedo ver los errores, ya que sólo muestra un número y eso no me dice nada, no sé si se pueden ver los literales de los errores para ver qué pasa, porque parece que hace algo, pero resulta que no.
Si quieres ver los errores, debes primero saber por dónde generan la salida los diversos comandos que ejecutas: la salida estándar, la salida estándar de errores, algún archivo log, etc. Si se trata de archivos log, pues es fácil saber dónde. Si es la salida estándar, puedes redirigir esas salidas con las opciones de redirección del shell (usar '>' en el lugar adecuado). Si ejecutas un comando desde Perl, recuerda que si usas system() solo verás el resultado (un valor numérico) de la ejecución. Si el comando genera alguna salida en la salida estándar, y quieres verlo, es mejor usar qx(), ya que te lo devolverá a la variable escalar que le digas.
Se puede resolver esto de varias formas. Dices al principio que se trata de un
script que se ejecuta continuamente, en un bucle, cada X minutos. ¿Tu puedes modificar ese
script? Si, por ejemplo, se tratase de un
script Perl, bastaría con poner una serie de líneas en el bucle, primero para comprobar que el archivo que contiene el parámetro 'n' ha cambiado. Segundo, leer ese parámetro 'n', y a continuación, ejecutar un exec() del *propio*
script, y pasándole como argumento ese parámetro 'n'. exec() sustituirá el
script actual por el ejecutable que le digas. Si es él
mismo, entonces estarás relanzando el
script.
Es más... ¿para qué reiniciar el
script, si te vale con leer el parámetro 'n' en cada vuelta?
Lo importante es que el
script tenga permiso de lectura del archivo que el cgi modifica.
Luego lo hemos complicado con la idea del cron. Entonces, yo he entendido que el
script realmente no se ejecuta de forma continuada, si no que queremos que todo el
script se ejecute cada 'n' minutos a través del cron.
Se puede hacer una cosa: Instala el
script en el cron del sistema, para que se ejecute cada minuto. En cada ejecución, lo primero que debe hacer es comprobar si, el minuto de tiempo en que está, es múltiplo del valor 'n' del archivo externo. Y si lo es, se ejecuta el resto.
Y si no puedes modificar el
script, por ser código cerrado, tampoco hay problema: Crea una envoltorio Perl que haga las operaciones anteriores, y que ejecute el
script si se dan las condiciones. Algo así:
Using perl Syntax Highlighting
#!/usr/bin/perl
#
# Este envoltorio (wrapper) se ejecuta cada minuto, a través del cron del sistema
#
# Leemos el minuto en que estamos
my $minuto = (localtime)[1];
# Leemos el valor de 'n' del archivo externo, un entero
my $n = 0+ do { open F, '/tmp/n.txt'; <F> };
# Comprobamos si estamos en múltiplo de esa cantidad de minutos
if ($minuto % $n == 0) {
system('/opt/IPCop/bin/ipstats');
}
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Ya solo queda hacer un cgi que modifique el valor de '/tmp/n.txt'.
No es óptimo, desde luego, pero todo depende de si podemos meterle mano al
script de IPCop o no. Si no podemos, pues hay que hacer estas trampas.
Se puede hacer de más formas, desde luego.