how - run bash script on boot linux
Init.d script colgando (3)
Tengo un script init.d que se ve así:
#!/bin/bash
# chkconfig 345 85 60
# description: startup script for swapi
# processname: swapi
LDIR=/var/www/html/private/daemon
EXEC=swapi.php
PIDF=/var/run/swapi.pid
IEXE=/etc/init.d/swapi
### BEGIN INIT INFO
# Provides: swapi
# Required-Start: $local_fs
# Required-Stop:
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Short-Description: startup script for swapi
# Description: startup script for swapi.php which processes actionq into switch
### END INIT INFO
if [ ! -f $LDIR/$EXEC ]
then
echo "swapi was not found at $LDIR/$EXEC"
exit
fi
case "$1" in
start)
if [ -f $PIDF ]
then
echo "swapi is currently running. Killing running process..."
$IEXE stop
fi
$LDIR/$EXEC >> $LDIR/swapi.log & MYPID=$!
echo $MYPID > $PIDF
echo "swapi is now running."
;;
stop)
if [ -f $PIDF ]
then
echo "Stopping swapi."
PID_2=`cat $PIDF`
if [ ! -z "`ps -f -p $PID_2 | grep -v grep | grep ''swapi''`" ]
then
kill -9 $PID_2
fi
rm -f $PIDF
else
echo "swapi is not running, cannot stop it. Aborting now..."
fi
;;
force-reload|restart)
$0 stop
$0 start
;;
*)
echo "Use: /etc/init.d/swapi {start|stop|restart|force-reload}"
exit 1
esac
Y luego tengo un cronjob keepalive que llama a esto si el pid cae. El problema es que ese guión keepalive se cuelga cada vez que lo ejecuto como un trabajo cron (es decir, run-parts / var / www / html / private / fivemin), (el script keepalive está en / var / www / html / private / fivemin) .
¿Hay algo funky en mi script de init.d que me falta?
¡He estado trabajando duro en este problema durante horas! Estoy en centos4 por cierto.
Gracias por cualquier ayuda. -Eric
EDITAR:
La secuencia de comandos keepalive / cronjob se simplificó para probar de forma simple:
#!/usr/bin/php
<?
exec("/etc/init.d/swapi start");
?>
Lo extraño es que la salida de error de swapi.php se coloca en / var / spool / mail como salida cron normal, excepto que tengo toda la salida en el swapi.log en el script init.d?
Cuando ejecuto keepalive.php desde cli (como root desde /) funciona exactamente como lo esperaría.
Cuando keepalive corre ps aux | grep php se ve así:
root 4525 0.0 0.0 5416 584 ? S 15:10 0:00 awk -v progname=/var/www/html/private/fivemin/keepalive.php progname {????? print progname ":/n"????? progname="";???? }???? { print; }
root 4527 0.7 1.4 65184 14264 ? S 15:10 0:00 /usr/bin/php /var/www/html/private/daemon/swapi.php
Y si hago un:
/etc/init.d/swapi stop
desde cli, ambos programas ya no están listados.
Swapi ls -l se ve así:
-rwxr-xr-x 1 5500 5500 33148 Aug 29 15:07 swapi.php
Así es como luce el crontab:
*/5 * * * * root run-parts /var/www/html/private/fivemin
Aquí está el primer bit de swapi.php
#!/usr/bin/php
<?
chdir(dirname( __FILE__ ));
include("../../config/db.php");
include("../../config/sql.php");
include("../../config/config.php");
include("config_local.php");
include("../../config/msg.php");
include("../../include/functions.php");
set_time_limit(0);
echo "starting @ ".date("Ymd.Gi").".../n";
$actionstr = "";
while(TRUE){
Modifiqué el script init.d y puse init sobre las declaraciones de variables, no hizo la diferencia.
Asegúrese de que su secuencia de comandos tenga los permisos de ejecución correctos , el propietario correcto y las primeras líneas se verán así:
#!/usr/bin/php
<?php
Cuando ejecuta un comando desde cron
, el entorno no es el mismo que cuando se ejecuta desde la línea de comando bash después de iniciar sesión. Sospecho que en este caso el sh
no puede entender swapi.php
como un comando PHP.
Haz un
which php
para ver dónde está tu php binario y añádelo a tu script init.d
PHP=/usr/bin/php
...
$PHP $LDIR/$EXEC >> $LDIR/swapi.log & MYPID=$!
Probablemente no sea tan importante, pero es posible que desee redirigir la salida de la línea cron
0 * * * * /path/to/script 2>&1 >> /dev/null
por ejemplo.
La respuesta fue que bash permanecía abierto porque mi script init.d no estaba redirigiendo la salida de stderr. Ahora lo he cambiado a
$LDIR/$EXEC &> $LDIR/swapi.log & MYPID=$!
Y ahora funciona perfectamente.
Gracias por ayudar a todos!