¿Cómo ejecutar scripts al inicio?

520

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

myusuf3
fuente
3
Si alguien también pudiera mostrar CUÁNDO y DÓNDE, eso sería increíble. Digo esto porque sé que hay al menos 2 formas de iniciar un script que se activará antes de que se inicien otras aplicaciones (como X11)
Buttink el
1
Todo este hilo de respuestas es un desastre. El formato Stack Exchange no parece ser el más adecuado para esta pregunta
Gabriel Fair
1
En realidad es bastante entretenido. ¿De cuántas maneras diferentes podría haber?
devios1

Respuestas:

206

Dependiendo de qué tipo de scripts necesita ejecutar. Para servicios y similares, debe usar upstart . ¡Pero para un script de usuario, gnome debería lanzarlos como scripts de sesión! Eche un vistazo en Sistema> Preferencias> Aplicaciones de inicio.

En una nota al margen, si necesita ejecutar algunos scripts en el inicio de sesión del terminal, puede agregarlos al archivo .bash_login en su directorio de inicio.

Para 14.04 y mayores

Un comando simple (uno que no necesita permanecer en ejecución) podría usar un trabajo de Upstart como:

start on startup
task
exec /path/to/command

Guarde esto en un .confarchivo en /etc/init(si necesita que se ejecute como root ~/.config/upstartcuando se inicie el sistema) o en (si necesita que se ejecute como su usuario cuando inicie sesión).

LassePoulsen
fuente
58
Teniendo en cuenta cómo se ejecuta SO y StackExchange, ¿podría dar un ejemplo de un script inicial y dónde se colocaría? Eso haría que esta sea una respuesta mucho mejor. Su enlace dice que no se está manteniendo y que mire el nuevo libro de cocina, que es enorme. No tengo mucha idea de por dónde empezar.
Ehtesh Choudhury
2
¿Qué sucede si necesito ejecutar el comando como root?
dopatraman
1
@dopatraman La respuesta indica que todos los procesos con esto se ejecutan como root.
AStopher
44
Actualice esta respuesta para explicar qué hacer en los sistemas que ejecutan systemd en lugar de upstart (Ubuntu 15.04+).
3
Esta respuesta no tiene sentido para mí. Las aplicaciones enumeradas en system->pref->startup applicationsno se pueden encontrar /etc/init/ni en ~/.config/upstart. Entonces, ¿ dónde se definen las aplicaciones de inicio?
phil294
553

Un enfoque es agregar una tarea cron @reboot :

  1. La ejecución crontab -ele permitirá editar su cron.
  2. Agregando una línea como esta:

    @reboot /path/to/script
    

    ejecutará ese script una vez que su computadora se inicie.

ceejayoz
fuente
85
La @rebootpalabra clave es un buen consejo porque no se conoce ampliamente.
jathanism
12
Agradable. ¿Alguna idea exactamente cuando esto se dispara?
Oli
2
Entonces ... ¿esto no funcionaría si perdiera energía y la PC volviera a funcionar cuando se restablezca la energía?
Mike Wills
18
@siamii: man 5 crontabdice que @rebootse ejecuta al inicio (cuando se inicia cron daemon).
jfs
99
Esto es asombroso Hasta ahora, esto parece mejor que rc.localya que el sistema parece más configurado en este punto (RUTA, etc.). Es extraño que sea tan difícil llamar a algo después del inicio del sistema ..
Karthik T
161

¿Qué hay de agregar el comando a /etc/rc.local? tendrás que usar el acceso sudo para editar este archivo.

sudo nano /etc/rc.local
paolo granada lim
fuente
19
Esto responde más directamente a la pregunta: cómo simplemente ejecutar algunos scripts cuando se inicia el sistema. upstart realiza una tarea más compleja: inicia procesos de daemon.
Dogweather
1
Entonces, ¿el inicio comienza los procesos de demonio mientras que /etc/rc.local comienza los scripts de bash?
Donato
55
¿Deberia? Esto ya no funciona en estos días, ¿verdad?
DaVince
44
Doenst funciona con Ubuntu 17.04 systemd
qodeninja
3
Tenga en cuenta que si crea este archivo usted mismo (como lo hice), tendrá que cambiar el archivo a ejecutable chmod 755 rc.localy agregarlo #!/bin/basha la primera línea.
psitae
77

Para 15.04 y posterior:

Para ejecutar un comando (de corta duración) 1 al inicio usando systemd, puede usar una unidad de tipo systemd OneShot. Por ejemplo, crear que /etc/systemd/system/foo.servicecontiene:

[Unit]
Description=Job that runs your user script

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

[Install]
WantedBy=multi-user.target

Entonces corre:

sudo systemctl daemon-reload
sudo systemctl enable foo.service

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

Puede ejecutar múltiples comandos desde el mismo archivo de servicio, usando múltiples ExecStartlíneas:

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

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

Pertinente:


Para las sesiones de usuario, puede crear la unidad systemd en su ~/.config/systemdlugar. Esto debería funcionar con 16.04 en adelante, pero no con versiones anteriores de Ubuntu con systemd (ya que todavía se usaba 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 --useropción agregada:

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

Sintaxis de Shell

Tenga en cuenta que, a diferencia de Upstart, systemd no ejecuta los Exec*comandos a través de un shell. Realiza una expansión variable limitada y un comando múltiple (separado por ;sí mismo), pero eso es todo en lo que respecta a la sintaxis tipo shell. Para cualquier cosa más complicada, por ejemplo, redirección o canalizaciones, envuelva su comando en sh -c '...'o bash -c '...'.


1 A diferencia de los demonios de larga vida.

muru
fuente
¿Es posible establecer una prioridad en el trabajo? o especifica que depende de otro servicio que se inicie primero?
r3wt
1
@ r3wt sí, hay diferentes formas de hacerlo. El WantedByutilizado aquí, por ejemplo, hace que comience cuando multi-user.targetse alcanza el. Se puede utilizar Before, After, Requires, etc. Véaseman systemd.unit
Muru
@PerlDuck no es lo único que faltaba. ¡Gracias!
Muru
De nada. - Por cierto, RemainAfterExitdepende del servicio que inicie y de su comportamiento deseado. Por ejemplo, /bin/df -h<s> would </s> debería tener RemainAfterExit=no.
PerlDuck
@PerlDuck No hay nada inherente en dfesas necesidades RemainAfterExit=no. A menos que desee ejecutar repetidamente el comando cada vez que ejecute systemctl start foo.
Muru
71

Hay diferentes formas de ejecutar comandos automáticamente:

  1. El sistema de arranque ejecutará todos los scripts desde los cuales encuentra una configuración en el directorio /etc/init. Estos scripts se ejecutarán durante el inicio del sistema (o en respuesta a ciertos eventos, por ejemplo, una solicitud de apagado) y, por lo tanto, 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 en: http://upstart.ubuntu.com/getting-started.html las páginas del manual man 5 inity le man 8 initdaremos todos los detalles.

  2. .gnomercCada vez que inicia sesión en una sesión de GNOME, se obtiene automáticamente un script de shell nombrado en su directorio de inicio. Puedes poner comandos arbitrarios allí; cualquier programa que ejecute en su sesión verá las variables de entorno que establezca en este script.

    Tenga en cuenta que la sesión no comienza hasta que .gnomercfinaliza el script; por lo tanto, si desea iniciar automáticamente un programa de ejecución prolongada, debe adjuntarlo &a la invocación del programa para separarlo del shell en ejecución.

  3. La opción de menú Sistema -> Preferencias -> Aplicaciones de inicio le permite definir qué aplicaciones deben iniciarse 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 del .gnomercscript, excepto que no necesita saber la shsintaxis (pero tampoco puede usar ninguna shconstrucción de programación).

Riccardo Murri
fuente
11
3) "Esto tiene casi el mismo propósito y alcance del script .gnomerc", excepto que .gnomercaparentemente se ejecuta antes de cargar Unity, y Startup Applicationsaparentemente se ejecuta después de cargar Unity. Tuve que ejecutar un programa que se encuentra en la barra de menú de Unity y ¡marcó una gran diferencia en este caso!
Ese tipo brasileño el
1
@ ruda.almeida Gracias por señalar eso. La respuesta fue escrita en los días previos a la Unidad.
Riccardo Murri
1
sudo update-rc.d myscript.sh defaults, donde /etc/init.d/myscript.sh es su script, también lo ejecuta al inicio.
Dan Dascalescu
27
$HOME/.config/autostart
  • Esta ubicación contiene la lista de aplicaciones de inicio.
  • .desktop El archivo se puede poner aquí, que se ejecutará en el inicio.

Ejemplo de muestra para .desktoparchivo:

Poniendo el siguiente .desktoparchivo $HOME/.config/autostarty 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 para /usr/local/binque se pueda ejecutar directamente mediante el comando decir myscriptreemplazado por "</path/to/script>").

Ejemplo de muestra de script.sh:

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

Resultado: se .desktopiniciará el archivo desde el $HOME/.config/autostartcual se ejecutará el scriptExec=

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

Pandya
fuente
18

Para cosas simples, puede agregar un comando en Sistema-> Preferencias-> Sesiones que apuntan a la ubicación de su script.

Alternativamente, puede agregarlo a /etc/init.d/rc.local o hacer un trabajo inicial si es un material de nivel más bajo .

Eche un vistazo a https://help.ubuntu.com/community/UbuntuBootupHowto para obtener más información

tutuca
fuente
7

cron respuesta implementada diferente de los más votados

Esta respuesta todavía usa cronpero usa un método diferente que la respuesta más votada. Esto funciona desde Ubuntu 16.04, pero probablemente sea compatible mucho antes. Es solo que comencé a usar cronpara ejecutar trabajos cuando la computadora se inicia desde 16.04.

¿Cuándo croncorre?

En los comentarios, alguien preguntó "¿cuándo corren?". Puedes decir 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 cronpuede enviarle por correo electrónico el estado de los trabajos ejecutados y los @reboottrabajos ejecutados para que el administrador de red y el correo electrónico tempranos no se ejecuten a menos que coloque un sleepcomando en sus scripts.

Donde poner tus guiones

Pon tus 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 guión?

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`
WinEunuuchs2Unix
fuente
1
Hay muchas formas diferentes de agregar cronjobs, pero el núcleo de la respuesta altamente votada y su respuesta sigue siendo la @reboot.
muru
Los métodos alternativos para agregar crontabs deben publicarse en askubuntu.com/q/2368/158442 , que se trata explícitamente de agregar trabajos de Cron.
muru
1
Siento disentir. El núcleo de la respuesta en cuestión utiliza lo crontab -eque algunos consideran una de las artes negras debido a una interfaz tipo vim. Por otro lado, esta respuesta podría atraer a aquellos cuyos cerebros están conectados de cierta manera. No todos somos del mismo molde. Por otra parte, esta respuesta ya tiene un voto negativo, así que dejaremos que la democracia siga su curso.
WinEunuuchs2Unix
2
Oh por favor. Usted y yo sabemos que el editor puede ser cambiado.
muru
@muru Sí, probablemente porque me enseñaste y aprendí a cambiar el editor a algo como nano o un par de otras CLI. Pero estoy en el campamento de gedit. Además, crontab -etrae recuerdos de asteriscos ("*") por minutos, horas, etc., que siempre he encontrado para los que necesito buscar instrucciones en google. Todavía encuentro usando /etc/cron.dy /etc/cron.dailymi elección. Sobre todo porque refleja /etc/udev/rules.dy /etc/systemd/system-sleepmétodos. Simplemente parece un buen ajuste.
WinEunuuchs2Unix
5

Deberías usar advenedizo para esto. Upstart se usa para los procesos de Ubuntu que se inician automáticamente. Es una solución mejorada como las antiguas secuencias de comandos init.d de System-V. También le permite poner requisitos previos al comienzo de su script (es decir, ¿necesita que la red se ejecute? Etc.)

txwikinger
fuente