Cómo ejecutar un script de shell al inicio

Resuelto meetamit asked hace 12 años • 24 respuestas

En una instancia de Amazon S3 Linux, tengo dos scripts llamados start_my_appque stop_my_appse 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_appse ejecute cada vez que se inicie el sistema. Sé que necesito agregar un archivo dentro init.dy 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_apppero eso no me ha funcionado.

meetamit avatar Oct 19 '12 18:10 meetamit
Aceptado

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.

Hemant kumar avatar Mar 25 '2015 05:03 Hemant kumar

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
Jonathan Muller avatar Oct 19 '2012 11:10 Jonathan Muller

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.localarchivo 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.localenfoque, aquí hay un /etc/rc.localarchivo 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
Gilles Quénot avatar Oct 19 '2012 11:10 Gilles Quénot

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, rootpuede utilizar chkconfigpara habilitar o deshabilitar el script al inicio:

chkconfig --list apex
chkconfig --add apex

Y puedes usar service start/stop apex.

Saule avatar Jun 20 '2014 07:06 Saule

Ingrese cronusando 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 :

  1. Ejecute su script de prueba sin cron para asegurarse de que realmente funcione.

  2. Asegúrese de haber guardado su comando en cron, usesudo crontab -e

  3. Reinicie el servidor para confirmar que todo funciona.sudo @reboot

user3140639 avatar Oct 25 '2017 05:10 user3140639