¿Cómo puedo ejecutar scripts automáticamente cuando se inicia Ubuntu para que no tenga que ejecutarlos manualmente después del inicio?
¿Cómo puedo ejecutar scripts automáticamente cuando se inicia Ubuntu para que no tenga que ejecutarlos manualmente después del inicio?
Respuestas:
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.
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 .conf
archivo en /etc/init
(si necesita que se ejecute como root ~/.config/upstart
cuando se inicie el sistema) o en (si necesita que se ejecute como su usuario cuando inicie sesión).
system->pref->startup applications
no se pueden encontrar /etc/init/
ni en ~/.config/upstart
. Entonces, ¿ dónde se definen las aplicaciones de inicio?
Un enfoque es agregar una tarea cron @reboot :
crontab -e
le permitirá editar su cron.Agregando una línea como esta:
@reboot /path/to/script
ejecutará ese script una vez que su computadora se inicie.
@reboot
palabra clave es un buen consejo porque no se conoce ampliamente.
man 5 crontab
dice que @reboot
se ejecuta al inicio (cuando se inicia cron daemon).
rc.local
ya 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 ..
¿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
chmod 755 rc.local
y agregarlo #!/bin/bash
a la primera línea.
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.service
contiene:
[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 ExecStart
lí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/systemd
lugar. 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 --user
opción agregada:
systemctl --user daemon-reload
systemctl --user status foo.service
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.
WantedBy
utilizado aquí, por ejemplo, hace que comience cuando multi-user.target
se alcanza el. Se puede utilizar Before
, After
, Requires
, etc. Véaseman systemd.unit
RemainAfterExit
depende del servicio que inicie y de su comportamiento deseado. Por ejemplo, /bin/df -h
<s> would </s> debería tener RemainAfterExit=no
.
df
esas necesidades RemainAfterExit=no
. A menos que desee ejecutar repetidamente el comando cada vez que ejecute systemctl start foo
.
Hay diferentes formas de ejecutar comandos automáticamente:
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 init
y le man 8 init
daremos todos los detalles.
.gnomerc
Cada 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 .gnomerc
finaliza 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.
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 .gnomerc
script, excepto que no necesita saber la sh
sintaxis (pero tampoco puede usar ninguna sh
construcción de programación).
.gnomerc
aparentemente se ejecuta antes de cargar Unity, y Startup Applications
aparentemente 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!
sudo update-rc.d myscript.sh defaults
, donde /etc/init.d/myscript.sh es su script, también lo ejecuta al inicio.
$HOME/.config/autostart
.desktop
El archivo se puede poner aquí, que se ejecutará en el inicio.Ejemplo de muestra para .desktop
archivo:
Poniendo el siguiente .desktop
archivo $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 para /usr/local/bin
que se pueda ejecutar directamente mediante el comando decir myscript
reemplazado por "</path/to/script>"
).
Ejemplo de muestra de script.sh
:
#!/bin/bash
<commands to be executed>
exit
Resultado: se
.desktop
iniciará el archivo desde el $HOME/.config/autostart
cual se ejecutará el scriptExec=
Por lo tanto, ¡puede ejecutar el script de shell deseado al inicio!
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
cron
respuesta implementada diferente de los más votadosEsta respuesta todavía usa cron
pero 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 cron
para ejecutar trabajos cuando la computadora se inicia desde 16.04.
cron
corre?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 cron
puede enviarle por correo electrónico el estado de los trabajos ejecutados y los @reboot
trabajos ejecutados para que el administrador de red y el correo electrónico tempranos no se ejecuten a menos que coloque un sleep
comando en sus scripts.
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
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`
@reboot
.
crontab -e
que 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.
crontab -e
trae 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.d
y /etc/cron.daily
mi elección. Sobre todo porque refleja /etc/udev/rules.d
y /etc/systemd/system-sleep
métodos. Simplemente parece un buen ajuste.
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.)