¿Cómo puedo ejecutar un script al inicio en Ubuntu Server 17.10?

13

¿Cómo puedo ejecutar un script al inicio en una máquina Ubuntu Server 17.10? Creo que el método fue cambiado en 17.10.

Rodolfho
fuente

Respuestas:

14

Coloque el script en la crontabla de usuario apropiada (es decir, el crontab ) con una programación de @reboot.

Un usuario puede editar su crontabla con crontab -e.

Un ejemplo que se ejecutará /path/to/script.shal inicio:

@reboot /path/to/script.sh

Si necesita ejecutarlo como root, no lo use @reboot sudo /path/to/script.sh;
use sudo crontab -eu rootpara editar el crontab de root.

Ver también: crontab (1), cron (8), crontab (8)

DopeGhoti
fuente
2

Ubuntu 15.04 y reenviar de manera predeterminada usa algo llamado systemd, que es un programa (más o menos) que automatiza los servicios y procedimientos de inicio. Puede hacer el suyo y agregarlo a la lista de servicios de inicio con solo un poco de esfuerzo.

Servicio básico de Systemd

Este es un .servicearchivo básico que podría usarse para iniciar mi servidor Python GUI (podría haber sido un script de shell, no importa):

[Unit]
Description=Python GUI Server

[Service]
ExecStart=/home/pi/software/GUI_POE.py &

[Install]
WantedBy=multi-user.target

La Descriptionopción es cualquier cadena que describa qué es o hace el servicio.

La ExecStartopción especifica el comando a ejecutar. Aquí, doy una ruta a un script ejecutable de Python y uso el &token para ejecutarlo en segundo plano.

La WantedByopción especifica la precedencia, en función de qué destino desea usar este servicio. Si no necesita que su servicio se ejecute en un momento muy específico, simplemente configúrelo en multi-user.target.

Procedimiento basico

  1. Escriba el script que desea ejecutar en el inicio utilizando nanoo cualquier editor de su elección. Asegúrate de incluir el shebang adecuado en la parte superior del archivo ( #!/bin/bashpara scripts bash) y dale permisos de ejecución con chmod.

  2. Simplemente escriba su servicio en un archivo llamado my_service.service, y luego cópielo en el directorio correspondiente con cp my_service.service /lib/systemd/system/.

  3. Comience su servicio: sudo systemctl start my_service.service. Esto inicia cualquier script que le haya indicado a su servicio que ejecute. El mismo comando con "detener" en lugar de inicio lo desactivará.

  4. Añadir su servicio para el proceso de puesta en marcha: sudo systemctl enable my_service.service. Para eliminarlo, simplemente reemplace "habilitar" con "deshabilitar" en el mismo comando.

¡Y eso es! Tenga en cuenta que su script se ejecutará automáticamente con permisos de root, ya que eso es predeterminado en los servicios systemd.

Mi ejemplo simple (completo)

Como referencia, aquí hay un servicio systemd simple que tengo que lanza un servidor Python GUI simple usando Dash:

[Unit]
Description=Python GUI Server
After=network-online.target

[Service]
Type=simple
WorkingDirectory=/home/pi/software
ExecStart=/home/pi/software/GUI_POE.py &
Restart=always
RestartSec=15s
KillMode=process
TimeoutSec=infinity
User=pi
Group=pi

[Install]
WantedBy=multi-user.target

Este servicio de ejemplo usa un script Python3 pero la fórmula es exactamente la misma para un script de shell.

Puede encontrar más información en este excelente tutorial de DigitalOcean, y este hilo de AskUbuntu con una excelente respuesta que me ayudó a aprender systemd. ¡Espero que esto ayude!

Tyrel Kostyk
fuente
2
¡Gracias por aportar una perspectiva systemd a esta pregunta! Señalaría que no hay una necesidad real de forzar el fondo en la línea ExecStart.
Jeff Schaller