Cómo iniciar una aplicación automáticamente en el arranque


27

Soy nuevo en Linux y espero iniciar la aplicación (que alterna un led cada 10 segundos). He escrito el programa de aplicación y funciona bien, pero ahora quiero iniciarlo automáticamente en el arranque.

La documentación aquí dice copiar el script de inicio en el /etc/init.ddirectorio y hacer un enlace simbólico al script copiado en el rc.ddirectorio.

¿Cuál debería ser la extensión y el nombre de estos archivos de script? ¿Podemos agregar manualmente el enlace simbólico rc.do hay algún procedimiento específico para esto?

¿Alguna sugerencia de cómo lograrlo?


La forma preferida de agregar un script de inicio al inicio varía según las distribuciones. Algunos incluso los están eliminando gradualmente a favor de advenedizos y systemd. No recomendaría simplemente usar "&" en segundo plano, ya que algo como Debian lo start-stop-daemonmaneja mejor (aunque es preferible que el programa mismo demonice). ¿Qué distro está usando? Fuera de los tipos MIME de escritorio, las extensiones de archivo no tienen sentido en * nix y se prefiere que los ejecutables no tengan uno.
jordanm

Si está utilizando petalogix, solo siga esa documentación; no se requieren nombres especiales, simplemente haga lo que le dicen. ¿Lo intentaste? ¿Qué problemas tienes? (De lo contrario, especifique su distribución y explique qué no funciona con lo que intentó)
Mat

Estoy usando Debian "wheezy" para RPi.
desfiladero

1
si necesita hacerlo aproximadamente cada 10 segundos (es decir, no 10 segundos en punto), puede usarlo cronen su lugar.
Peter

@peterph: pero parece que el programa alterna el LED cada 10 segundos, no un programa que se ejecuta cada 10 segundos.
Zorawar

Respuestas:


19

Aquí está el extracto de http://www.debian-administration.org/articles/28 que parece responder a su pregunta.

Nota: En el siguiente script de ejemplo, simplemente agregue una llamada a la start)sección " " para iniciar realmente su programa. Puede probar la funcionalidad del script sin reiniciar el sistema: llámelo con la ruta completa y proporcione un parámetro de " start" o " stop"

Aquí va:

Debian utiliza un sistema de inicio tipo Sys-V para ejecutar comandos cuando cambia el nivel de ejecución del sistema, por ejemplo, en el momento del arranque y el apagado.

Si desea agregar un nuevo servicio para comenzar cuando la máquina se inicia, debe agregar el script necesario al directorio /etc/init.d/. Muchos de los scripts ya presentes en ese directorio le darán un ejemplo del tipo de cosas que puede hacer.

Aquí hay un script muy simple que se divide en dos partes, el código que siempre se ejecuta y el código que se ejecuta cuando se llama con "inicio" o "detención".

#! /bin/sh
# /etc/init.d/blah
#

# Some things that run always
touch /var/lock/blah

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting script blah "
    echo "Could do more here"
    ;;
  stop)
    echo "Stopping script blah"
    echo "Could do more here"
    ;;
  *)
    echo "Usage: /etc/init.d/blah {start|stop}"
    exit 1
    ;;
esac

exit 0

Una vez que haya guardado su archivo en la ubicación correcta, asegúrese de que sea ejecutable ejecutando " chmod 755 /etc/init.d/blah".

Luego, debe agregar los enlaces simbólicos apropiados para que el script se ejecute cuando el sistema se caiga o se active.

La forma más sencilla de hacerlo es usar el comando específico de Debian update-rc.d:

root@skx:~# update-rc.d blah defaults
 Adding system startup for /etc/init.d/blah ...
   /etc/rc0.d/K20blah -> ../init.d/blah
   /etc/rc1.d/K20blah -> ../init.d/blah
   /etc/rc6.d/K20blah -> ../init.d/blah
   /etc/rc2.d/S20blah -> ../init.d/blah
   /etc/rc3.d/S20blah -> ../init.d/blah
   /etc/rc4.d/S20blah -> ../init.d/blah
   /etc/rc5.d/S20blah -> ../init.d/blah

¿Debo colocar este script en etc / init.d / o la línea en la parte superior, # /etc/init.d/blah, indica una ubicación en el shell?
user137717

Recibo "-sh: update-rc.d: comando no encontrado"
m4l490n

2
Los sistemas más nuevos emplean systemdpara muchas cosas, incluso para la configuración de arranque. Úselo systemctlpara controlar y configurar systemd.
Alexander Shcheblikin

4

La mejor manera es verificar la fuente del paquete de su distribución para un servicio de sistema regular, por ejemplo, para OpenSSH: verá cuáles son las buenas prácticas. Después de todo, una de las razones detrás del código abierto es poder aprender de las fuentes.


2
Excelente consejo! Verdaderamente sabio y relevante, y sintonizado con todos los Distos. (Y, por cierto, responde la parte de la pregunta "nuevo en Linux" y "cómo lo hago".
Usaré

3

Use Supervisor, un programa efectivo que administra y registra las aplicaciones de inicio con argumentos. Obtenga más información en http://supervisord.org/running.html y (Siga las instrucciones de instalación.

Cree un archivo conf en /etc/supervisor/conf.d/{PROGRAM_NAME}.confy Aquí está el código,

[program:{PROGRAM_NAME}]
command=/usr/bin/{PROGRAM_NAME} -arg1 -arg2
autostart=true  
autorestart=true  
stderr_logfile=/var/log/supervisor/{PROGRAM_NAME}.err.log  
stdout_logfile=/var/log/supervisor/{PROGRAM_NAME}.out.log  

Luego ejecute desde la línea cmd:

supervisorctl reload


Mientras que su respuesta está bien, creo que debería cambiarla para mostrar que "supervisorctl reload" debe ejecutarse desde la CLI, no insertarse en el archivo .conf
dlewin

3

Usar crontabes mucho más fácil.

Se usa crontab -epara editar el crontab del usuario.
Agregue la siguiente línea al final:

@reboot <command>

Ejemplos:

  • @reboot my_script.sh
  • @reboot python my_script.py arg1 arg2

Finalmente, use crontab -lpara asegurarse de que su secuencia de comandos se haya agregado a la lista.


Me pregunto por qué esta respuesta recibió votos negativos. Parece una solución muy simple, y una que usa crontab, que probablemente todos ya conocen y entienden.
Kolinko

1

Nuevas versiones de linux soporte systemd (como dijo @AlexanderShcheblikin). Tiene más funciones y es más portátil que la solución específica de Debian.

Por favor lee esta guía realmente genial .

Aquí hay una referencia rápida de la mínimo necesario:

  1. Un script (por ejemplo myscript.sh) con permisos ejecutables.
  2. Un archivo de unidad (p. Ej. myservice.service ) con la extensión ".service" /etc/systemd/systemcon 644 permisos que contiene el comando para ejecutar el script. Por ejemplo,

:

[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/bin/bash /path/to/myscript.sh

[Install]
WantedBy=multi-user.target
  1. Ejecute el comando sudo systemctl enable myservicepara permitir que se inicie en el arranque.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.