Buenas noches, he instalado openvpn en la raspberry, todo bien hasta que apago la pi y la vuelvo a encender, ya no se conecta a la openvpn, tengo que volver a lanzar la orden para que vuelva a activar la vpn.
¿ Como puedo crear un script para que cuando reinicie la pi, se conecte a openvpn solo?
los script que he puesto para instalar oscam han sido los que venian en los manuales, por eso no tengo ni idea que comandos poner en el script, ni donde meter el archivo que tenga que crear.
muchas gracias, estoy empezando con esto de raspberry
Yo para esto, ya sea una raspi, un deco o un vps/servidor dedicado.
Lo que suelo hacer primero siempre, es crear un script dentro de /etc/init.d vacío, genero un enlace simbólico a /etc/rc3.d y le asigno que se ejecute de los primeros, pero tampoco nada más iniciar el sistema, para así evitar petar otros procesos que aún se están lanzando en segundo plano.
Ejemplo, creas un script dentro de /etc/init.d llamado estado.sh (lo puedes llamar como quieras), te dejo un ejemplo para ncam, pero te va a servir de base para todo:
code_language.shell:
#! /bin/sh
# Script para arranque de servicios en /etc/init.d/
#
case "$1" in
start)
echo "Iniciando servicio... "
# Aquí comando a ejecutar para arrancar el servicio
/var/bin/ncam -b
sleep 2
;;
stop)
echo "Deteniendo servicio..."
# Aquí comando a ejecutar para detener el servicio
killall -9 ncam
;;
*)
echo "Modo de empleo: /etc/init.d/mi_script {start|stop}"
exit 1
;;
esac
exit 0
y luego le das permisos 755, te puedes asegurar por terminal ya de camino que en /etc/init.d no se quede ninguno sin permisos 755 y matas 2 pájaros de un tiro con:
Code:
chmod 755 /etc/init.d/* 2>/dev/null
luego generas el enlace simbólico a /etc/rc3.d por terminal con:
Code:
ln -s /etc/init.d/estado.sh /etc/rc3.d/S60estado
Donde el S60 corresponden al tiempo de arranque, yo menos de 60 no pondría nunca.
Con esto ya tendrías un script operativo donde no sólo podrás iniciar servicios, si no que añadiéndole debajo del primer sleep una llamada a otro/s script/s, te permitirá que se ejecute/n al iniciar el sistema.
Ejemplo añadiendo un segundo script que por ejemplo tenemos en /var/script/ y es el encargado de levantar ncam cada vez que se caiga:
Seguramente no exista ningún directorio llamado script dentro de var, lo puedes crear por terminal con:
Code:
mkdir -p /var/script 2>/dev/null
Creamos el script dentro de ese nuevo directorio, yo qué sé... Por ejemplo ncamcpu.sh con el siguiente contenido:
code_language.shell:
#!/bin/sh
max_ncam=$(ps -C ncam -o user,pid,pcpu,pmem,vsz --no-headers | awk '{ if ( $3 > 80) print $2}')
if [ -z "$max_ncam" ]; then
echo "ncam ok" #>> /tmp/killncam.log
echo && date #>> /tmp/killncam.log
else
echo && date #>> /tmp/killncam.log
echo ncam killed
kill -9 `ps ax | grep [C]omprobar_proceso.sh | grep -v grep | awk '{print $1}'` 2>/dev/null
kill -9 $max_ncam
fi
sh /var/script/Comprobar_proceso.sh >> /dev/null 2>&1
exit 0
El # delante de >> /tmp/killncam.log evita generar un archivo log en /tmp, si lo quieres habilitar, puedes hacerlo quitándolo.
En este caso si te fijas, ese script lanza otro en segundo plano llamado Comprobar_proceso.sh que es el encargado de levantar el proceso activo, que vendría a ser así:
code_language.shell:
#!/bin/sh
PROCESO='ncam'
RUTA_PROCESO='/var/bin'
TIEMPO='15'
LOG=/tmp/test_$PROCESO.log
echo " ----- Iniciando test $PROCESO -----"
echo ''
echo ''
echo 'Vamos a comprobar el proceso activo'
echo ''
sleep 2
if pidof $PROCESO > /dev/null
then
echo ''
echo "$PROCESO activo"
else
echo "Alerta! $PROCESO detenido :( "
fi
date=`date`
echo "Iniciando test $PROCESO : $date" >> $LOG
while [ 1 ]
do
pidof $PROCESO > /dev/null
if [ $? -eq 0 ] ; then
echo 'Vamos a proceder a comprobar de nuevo el proceso activo'
echo ''
echo ""
else
date=`date`
echo "Reiniciando $PROCESO : $date" >> $LOG
echo ''
killall -9 $PROCESO
$RUTA_PROCESO/$PROCESO -b & 2>/dev/null
if [ $? -eq 0 ] ; then
echo "Ok! el servicio $PROCESO de nuevo operativo :) "
else
echo "Algo no ha funcionado. Por favor, intenta iniciarlo manualmente"
fi
fi
#Tiempo de comprobación si el servicio sigue activo, si no lo está se reinicia.
sleep $TIEMPO
done
exit 0
Luego le damos permisos 755 a todo lo que tengas en ese directorio con:
Code:
chmod 755 /var/script/* 2>/dev/null
O directamente solo a ese script con
Code:
chmod 755 /var/script/ncamcpu.sh
Y luego al otro:
Code:
chmod 755 /var/script/Comprobar_proceso.sh
Aquí ya tú mismo.
Ya sólo nos quedaría editar el script estado.sh añadiéndole una llamada al primer script debajo del primer sleep como dije al principio:
Code:
sh /var/script/ncamcpu.sh
Quedando finalmente este así:
code_language.shell:
#! /bin/sh
# Script para arranque de servicios en /etc/init.d/
#
case "$1" in
start)
echo "Iniciando servicio... "
# Aquí comando a ejecutar para arrancar el servicio
/var/bin/ncam -b
sleep 2
sh /var/script/ncamcpu.sh
;;
stop)
echo "Deteniendo servicio..."
# Aquí comando a ejecutar para detener el servicio
killall -9 ncam
;;
*)
echo "Modo de empleo: /etc/init.d/mi_script {start|stop}"
exit 1
;;
esac
exit 0
Repito, lo estoy enfocando a NCam, pero es aplicable a todo lo que quieras y de paso tendrías un script de arranque universal.
Yo aparte, prefiero crear un segundo script llamado estado2.sh dentro de /etc/init.d para asegurarme que el ncamcpu.sh se ejecute si o si, ya que puede ser que depende del sistema instalado te funcione sólo algunas veces. Así que ná, hago lo mismo que al principio:
Genero el script estado2.sh con su contenido:
code_language.shell:
#! /bin/sh
# Script para arranque de servicios en /etc/init.d/
#
sh /var/script/ncamcpu.sh
exit 0
Donde cómo te dije antes, yo este sólo lo que hago es forzar su inicio, de ahí que no tenga ningún start ni stop ni nada, este mismo te valdría para iniciar otros igualmente por fuerza.
Y a este último le hago un enlace simbólico con 80 segundos:
Code:
ln -s /etc/init.d/estado2.sh /etc/rc3.d/S80estado2
Así si el otro no se ejecuta, este te lo va a iniciar seguro.
Se me ha ido la luz mientras estaba escribiendo el tocho, así que al final he tenido que resumir todo lo máximo posible, escribirlo todo 2 veces tiene tela marinera.
Espero que te sirva de ayuda a ti u a otro que lo necesite, en tu caso que lo que quieres es iniciar el openvpn, sería tan sencillo como localizar el script de arranque de este, que seguramente esté en /etc/init.d y generar un enlace simbólico a /etc/rc3.d o bien enfocar este que te pasé obviando la parte del segundo script en /var/script y cambiando el ejecutable de ncam por el de openvpn.
Un saludo