¿Cómo ejecutar scripts en el inicio?

455

¿Cómo puedo ejecutar scripts automáticamente cuando Ubuntu se inicia para que no tenga que ejecutarlos manualmente después del inicio?

    
pregunta myusuf3 04.08.2010 - 21:54

9 respuestas

191

Dependiendo del tipo de guiones que necesite ejecutar. Para servicios y similares, debe usar upstart . ¡Pero para una secuencia de comandos de usuario, deben ser lanzados como scripts de sesión por gnome! Eche un vistazo en Sistema & gt; Preferencias & gt; Aplicaciones de inicio.

Como nota adicional, si necesita ejecutar algunos scripts en el inicio de sesión del terminal, puede agregarlos al . Bash_login archivo en su directorio de inicio.

Para 14.04 en adelante

Un comando simple (uno que no necesita seguir ejecutándose) podría usar un trabajo Upstart como:

start on startup
task
exec /path/to/command

Guarde esto en un archivo .conf en /etc/init (si necesita ejecutarlo como root cuando el sistema arranque), o en ~/.config/upstart (si lo necesita) para ejecutar como usuario cuando inicies sesión).

    
respondido por el LassePoulsen 05.08.2010 - 01:26
475

Un enfoque es agregar una tarea @reboot cron :

  1. Ejecutando crontab -e te permitirá editar tu cron.
  2. Añadiéndole una línea como esta:

    @reboot /path/to/script
    

    ejecutará esa secuencia de comandos una vez que la computadora se inicie.

respondido por el ceejayoz 04.08.2010 - 21:57
132

¿Qué le parece agregar el comando a /etc/rc.local ? para editar este archivo, deberá usar sudo access.

sudo nano /etc/rc.local
    
respondido por el paolo granada lim 05.08.2010 - 18:40
68

Hay diferentes formas de ejecutar comandos automáticamente:

  1. El sistema upstart ejecutará todos los scripts desde los que encuentre una configuración en el directorio /etc/init . Estas secuencias de comandos se ejecutarán durante el inicio del sistema (o en respuesta a ciertos eventos, por ejemplo, una solicitud de cierre) y también son el lugar para ejecutar comandos que no interactúan con el usuario; todos los servidores se inician utilizando este mecanismo.

    Puede encontrar una introducción legible a at: enlace las páginas man man 5 init y man 8 init dan usted los detalles completos.

  2. Un script de shell llamado .gnomerc en su directorio de inicio se obtiene automáticamente cada vez que inicia sesión en una sesión de GNOME. Puedes poner comandos arbitrarios allí; las variables de entorno que establezca en este script serán vistas por cualquier programa que ejecute en su sesión.

    Tenga en cuenta que la sesión no se inicia hasta que finaliza el script .gnomerc ; por lo tanto, si desea iniciar automáticamente algún programa de larga ejecución, debe agregar & a la invocación del programa, para separarlo del shell en ejecución.

  3. La opción de menú Sistema - & gt; Preferencias - & gt; Startup Applications le permite definir qué aplicaciones se deben iniciar cuando se inicia su sesión gráfica (Ubuntu predefine bastante), y agregarlas o eliminarlas a su gusto. Esto tiene casi el mismo propósito y alcance que el script .gnomerc , excepto que no necesita conocer la sintaxis sh (pero tampoco puede usar ninguna construcción de programación sh ).

respondido por el Riccardo Murri 05.08.2010 - 16:02
53

para 15.04 y posterior:

Para ejecutar un comando (efímero) 1 al inicio con systemd, puede usar una unidad systemd de tipo OneShot . Por ejemplo, cree /etc/systemd/system/foo.service que contenga:

[Unit]
Description=Job that runs your user script

[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Luego ejecuta:

sudo systemctl daemon-reload
sudo systemctl enable foo.service

Básicamente, esto solo convierte un trabajo Upstart típico en uno systemd (ver Systemd para usuarios de Upstart ).

Puede ejecutar varios comandos desde el mismo archivo de servicio, usando múltiples ExecStart lines:

[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure

El comando siempre se debe dar con la ruta completa. Si algún comando falla, el resto no se ejecuta. Un - antes de la ruta le dice a systemd que ignore un estado de salida distinto de cero (en lugar de considerarlo como un error).

Relevante:

Para las sesiones de usuario, puede crear la unidad systemd en ~/.config/systemd en su lugar. Esto debería funcionar con 16.04 en adelante, pero no con lanzamientos anteriores de Ubuntu con systemd (ya que esos aún se usan Upstart para sesiones de usuario). Las unidades de sesión de usuario se pueden controlar con los mismos comandos que con los servicios del sistema, pero con la opción --user añadida:

systemctl --user daemon-reload
systemctl --user status foo.service

1 A diferencia de los demonios de larga vida.

    
respondido por el muru 09.01.2016 - 20:21
22
$HOME/.config/autostart
  • Esta ubicación contiene la lista de aplicaciones de inicio.
  • El archivo .desktop se puede poner aquí y se ejecutará al inicio.

Ejemplo de ejemplo para .desktop file:

Colocando el siguiente archivo .desktop en $HOME/.config/autostart y dado chmod +x :

[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script

Aquí "</path/to/script>" se reemplaza con la ruta a su script.sh
(generalmente se recomienda a /usr/local/bin so-eso se puede ejecutar directamente por comando decir myscript reemplazado con "</path/to/script>" ).

Ejemplo de muestra de script.sh :

#!/bin/bash
<commands to be executed>
exit

Resultado: El archivo .desktop se lanzará desde $HOME/.config/autostart y ejecutará el script por Exec=

¡Por lo tanto, puede ejecutar su script de shell deseado al inicio!

    
respondido por el Pandya 20.07.2014 - 08:14
18

Para cosas simples, puede agregar un comando en Sistema- & gt; Preferencias- & gt; Sesiones apuntando a la ubicación de su script.

Alternativamente, puede agregarlo a /etc/init.d/rc.local o realizar un advenedizo trabajo si es un < em> low level cosas.

Eche un vistazo a enlace para obtener más información

    
respondido por el tutuca 04.08.2010 - 21:59
5

Debería usar upstart para esto. Upstart se usa para procesos de Ubuntu que se inician automáticamente. Es una solución mejorada como los antiguos scripts de System-V init.d. También le permite poner requisitos previos al inicio de su script (es decir, ¿necesita la red en ejecución? Etc.)

    
respondido por el txwikinger 04.08.2010 - 21:58
3

cron respuesta implementada diferente de la más votado

Esta respuesta todavía usa cron pero usa un método diferente a la respuesta más votado. Esto funciona desde Ubuntu 16.04 pero probablemente sea compatible mucho antes. Es solo que comencé a usar cron para ejecutar trabajos cuando la computadora arranca desde 16.04.

¿Cuándo se ejecuta cron ?

En los comentarios alguien preguntó "¿cuándo se ejecutan?". Puedes verlo en syslog / journalctl:

$ journalctl -b | grep cron
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (pidfile fd = 3)
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (Running @reboot jobs)
Jan 02 16:54:40 alien systemd[1]: Started Run anacron jobs.
Jan 02 16:54:40 alien anacron[949]: Anacron 2.3 started on 2018-01-02
Jan 02 16:54:40 alien anacron[949]: Normal exit (0 jobs run)
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[951]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[985]: (root) CMD (   /usr/local/bin/cron-reboot-cycle-grub-background)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user root

Una cosa a tener en cuenta es que cron puede enviarte un correo electrónico con el estado de trabajos ejecutados y @reboot jobs ejecutados para que el administrador de red y el correo electrónico no se ejecuten a menos que pongas un comando sleep en tu script.

Dónde colocar tus scripts

Coloque sus scripts en el directorio /etc/cron.d :

$ ll /etc/cron.d
total 44
drwxr-xr-x   2 root root  4096 Nov 26 19:53 ./
drwxr-xr-x 139 root root 12288 Dec 31 13:58 ../
-rw-r--r--   1 root root   244 Dec 28  2014 anacron
-rw-r--r--   1 root root   148 Feb 18  2017 cycle-grub-background
-rw-r--r--   1 root root   138 Mar  5  2017 display-auto-brightness
-rw-r--r--   1 root root   460 Nov 26 19:53 nvidia-hdmi-sound
-rw-r--r--   1 root root   102 Feb  9  2013 .placeholder
-rw-r--r--   1 root root   224 Nov 19  2016 touch-vmlinuz
-rw-r--r--   1 root root   700 Aug  5 11:15 turn-off-hyper-threading

¿Cómo se ve un script?

Aquí hay un par de scripts que configuré para ejecutar cada arranque:

$ cat /etc/cron.d/cycle-grub-background SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 
@reboot   root    /usr/local/bin/cron-reboot-cycle-grub-background

$ cat /etc/cron.d/touch-vmlinuz
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot   root    touch "/boot/vmlinuz-"'uname -r'
    
respondido por el WinEunuuchs2Unix 03.01.2018 - 02:02

Lea otras preguntas en las etiquetas