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).
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?
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.
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
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).
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 '...'.
¿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:
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.
.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.
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).
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:
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!
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:
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.)
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.
Para 14.04 y mayores
Un comando simple (uno que no necesita permanecer en ejecución) podría usar un trabajo de Upstart como:
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).fuente
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:
ejecutará ese script una vez que su computadora se inicie.
fuente
@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.fuente
chmod 755 rc.local
y agregarlo#!/bin/bash
a la primera línea.Para 15.04 y posterior:
Para ejecutar un comando (de corta duración) 1 al inicio usando
systemd
, puede usar una unidad de tipo systemdOneShot
. Por ejemplo, crear que/etc/systemd/system/foo.service
contiene:Entonces corre:
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: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:
man 5 systemd.service
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: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 ensh -c '...'
obash -c '...'
.1 A diferencia de los demonios de larga vida.
fuente
WantedBy
utilizado aquí, por ejemplo, hace que comience cuandomulti-user.target
se alcanza el. Se puede utilizarBefore
,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 tenerRemainAfterExit=no
.df
esas necesidadesRemainAfterExit=no
. A menos que desee ejecutar repetidamente el comando cada vez que ejecutesystemctl 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 leman 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 lash
sintaxis (pero tampoco puede usar ningunash
construcción de programación).fuente
.gnomerc
aparentemente se ejecuta antes de cargar Unity, yStartup 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..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 dadochmod +x
:Aquí
"</path/to/script>"
se reemplaza con la ruta a suscript.sh
(generalmente se recomienda para
/usr/local/bin
que se pueda ejecutar directamente mediante el comando decirmyscript
reemplazado por"</path/to/script>"
).Ejemplo de muestra de
script.sh
: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!
fuente
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
fuente
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 usarcron
para ejecutar trabajos cuando la computadora se inicia desde 16.04.¿Cuándo
cron
corre?En los comentarios, alguien preguntó "¿cuándo corren?". Puedes decir en syslog / journalctl:
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 unsleep
comando en sus scripts.Donde poner tus guiones
Pon tus scripts en el directorio
/etc/cron.d
:¿Cómo se ve un guión?
Aquí hay un par de scripts que configuré para ejecutar cada arranque:
fuente
@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.)
fuente