Cómo ejecutar un script de shell al inicio
En una instancia de Amazon S3 Linux, tengo dos scripts llamados start_my_app
que stop_my_app
se inician y se detienen para siempre (que a su vez ejecutan mi aplicación Node.js). Utilizo estos scripts para iniciar y detener manualmente mi aplicación Node.js. Hasta ahora, todo bien.
Mi problema: también quiero configurarlo de manera que start_my_app
se ejecute cada vez que se inicie el sistema. Sé que necesito agregar un archivo dentro init.d
y sé cómo vincularlo simbólicamente al directorio adecuado dentro de rc.d
, pero no puedo entender qué es lo que realmente debe ir dentro del archivo que coloco init.d
. Estoy pensando que debería ser solo una línea, como, start_my_app
pero eso no me ha funcionado.
Primero cree su script de inicio @ /home/user/startup.sh y hágalo ejecutable.
chmod +x /home/user/startup.sh
Luego configura un crontab para ello:
$ crontab -e
@reboot /home/user/startup.sh
Ahora su script startup.sh se ejecutará en cada inicio.
El archivo que ingrese /etc/init.d/
debe configurarse como ejecutable con:
chmod +x /etc/init.d/start_my_app
Como lo señaló @meetamit, si aún no se ejecuta, es posible que deba crear un enlace simbólico al archivo en/etc/rc.d/
ln -s /etc/init.d/start_my_app /etc/rc.d/
Tenga en cuenta que en las últimas versiones de Debian, esto no funcionará ya que su script deberá ser compatible con LSB (proporcione al menos las siguientes acciones: iniciar, detener, reiniciar, forzar recarga y estado): https:// wiki .debian.org/LSBInitScripts
Como nota, siempre debes usar la ruta absoluta a los archivos en tus scripts en lugar de la relativa, ya que puede resolver problemas inesperados:
/var/myscripts/start_my_app
Finalmente, asegúrese de haber incluido el shebang encima del archivo:
#!/bin/sh
Un enfoque simple es agregar una línea en /etc/rc.local
:
/PATH/TO/MY_APP &
O, si desea ejecutar el comando como usuario especial:
su - USER_FOOBAR -c /PATH/TO/MY_APP &
(El signo final pone en segundo plano el proceso y permite que el rc.local
archivo continúe ejecutándose).
Alternativamente, si desea un script init.d completo, las distribuciones Debian tienen un archivo de plantilla que puede copiar así:
cp /etc/init.d/skeleton /etc/init.d/your_app
...y utilizarlo adaptándolo un poco.
Para el /etc/rc.local
enfoque, aquí hay un /etc/rc.local
archivo de ejemplo vacío que venía en distribuciones anteriores de Linux Ubuntu . Con uno de los comandos de ejemplo anteriores, se vería así:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Add your cmds you want to run as sudo at every boot here.
su - USER_FOOBAR -c /PATH/TO/MY_APP &
exit 0
Esta es la forma en que lo hago en los sistemas Red Hat Linux .
Coloque su script en /etc/init.d
, propiedad de root y ejecutable. En la parte superior del script, puedes dar una directiva para chkconfig
. Por ejemplo, el siguiente script se utiliza para iniciar una aplicación Java como usuario Oracle.
El nombre del guión es/etc/init.d/apex
#!/bin/bash
# chkconfig: 345 99 10
# Description: auto start apex listener
#
case "$1" in
'start')
su - oracle -c "cd /opt/apex ; java -jar apex.war > logs/apex.log 2>logs/apex_error.log &";;
'stop')
echo "put something to shutdown or kill the process here";;
esac
Esto dice que el script debe ejecutarse en los niveles 3, 4 y 5, y la prioridad para iniciar/detener es 99 y 10.
Luego, como usuario, root
puede utilizar chkconfig
para habilitar o deshabilitar el script al inicio:
chkconfig --list apex
chkconfig --add apex
Y puedes usar service start/stop apex
.
Ingrese cron
usando sudo
:
sudo crontab -e
Agregue un comando para ejecutar al inicio, en este caso un script:
@reboot sh /home/user/test.sh
Ahorrar:
Presione ESC y luego :x para guardar y salir, o presione ESC y luego ZZ (eso es shift+zz)
Prueba Prueba Prueba :
Ejecute su script de prueba sin cron para asegurarse de que realmente funcione.
Asegúrese de haber guardado su comando en cron, use
sudo crontab -e
Reinicie el servidor para confirmar que todo funciona.
sudo @reboot