Cómo ejecutar un script durante el arranque como root

59

Tenía un script que habilita automáticamente mi wifi sin usar networkmanager, pero no sé cómo ejecutar el script como root mientras el sistema se inicia. ¿Cómo hago que el script se ejecute automáticamente durante el arranque?

usuario128712
fuente
Los programas de inicio automático se configuran en autostartmanifiestos o en *.servicearchivos en varias ubicaciones, así como en init.do crontab. Vea esto: unix.stackexchange.com/a/525845/43233
Noam Manos

Respuestas:

54

Coloque el script que desea ejecutar en el directorio /etc/init.d y haga que el script sea ejecutable.

chmod 755 myscript

Una vez hecho esto, cree un enlace simbólico en el directorio de nivel de ejecución que le gustaría usar, por ejemplo, si desea ejecutar un programa en el nivel de ejecución gráfico 2, el nivel de ejecución predeterminado para Ubuntu, lo colocaría en el /etc/rc2.ddirectorio. Simplemente no puede colocarlo en el directorio, debe indicar cuándo se ejecutará indicando el inicio con una "S" y el orden de ejecución es importante. Colóquelo después de todo lo que está en el directorio dándole un número más alto.

Si el último script que se ejecutará es rc.localy se nombra, S99rc.localentonces debe agregar su script como S99myscript.

ln -s /etc/init.d/myscript /etc/rc3.d/S99myscript

Cada /etc/rc*.ddirectorio compatible con versiones anteriores tiene enlaces simbólicos al /etc/init.d/directorio.

Radu Rădeanu
fuente
1
Tenga en cuenta que en Ubuntu Server 14.04, necesitaba usar /etc/rc2.d, en lugar de rc3.dcomo se indica en el ejemplo. Parece rc2.dque no es solo el nivel de ejecución gráfica.
Brad
1
cd /etc/rc`cat /etc/init/rc-sysinit.conf | grep "env DEFAULT_RUNLEVEL" | grep -oP "\d"`.dlo llevará a qué /etc/rc?.ddirectorio corresponde a su nivel de ejecución predeterminado.
Kevin
1
En cambio: "Si el último script que se ejecutará es rc.localy se nombra, S99rc.localentonces debe agregar su script como S99myscript". ¿Quiso decir: "Si el último script que se ejecuta es myscripty se nombra, S99myscriptentonces debe agregar su script como S99myscript"?
Dor
66
Tenga en cuenta que esto no funcionará con systemd (es decir, comenzando con Ubuntu 16.04). Ver esto en su lugar.
Alexander Revo
26

Incluya el comando en /etc/rc.local. Se ejecutará cada vez que cambie el nivel de ejecución del usuario.

Nota: Debe colocar el comando antes de la última línea en /etc/rc.local que contiene: "exit 0".

thefourtheye
fuente
3
Nota: debe colocar el comando antes de la última línea /etc/rc.localque contiene: exit 0
rubo77
3
/etc/rc.localen ubuntu 15.10 comenta que "este script se ejecuta al final de cada nivel de ejecución multiusuario". Entonces, el script podría ejecutarse varias veces durante el arranque, ¿verdad?
jarno
@ jamo, sí, en cada nivel de ejecución. No sé cómo se relaciona esto con la ejecución "en el arranque", que generalmente significa "ejecutar una vez en el arranque".
erm3nda
17

Use una crontabopción para hacer que su script se ejecute después de reiniciar,

puedes hacerlo agregando @rebootcódigo en cron

Abrir crontab por usuario root:

$ sudo crontab -e

Agregue el siguiente registro en la parte inferior:

@reboot yourScriptPath 

Eso hará lo que quieras.

hs.chandra
fuente
¿Te refieres a usar el comando crontab -e, que no necesita privilegios de superusuario? Me pregunto si puede ejecutar scripts que deben ejecutarse como root.
jarno
Probé esto. No ejecuta el script como root.
jarno
44
Debe agregar la línea mientras ejecuta el comando sudo crontab -epara que ejecute el script como root durante el inicio.
jarno
no se olvide de quitar /var/run/crond.reboot, si no, no se ejecutará la tarea
Albert Català
Solo para el registro, estoy seguro de que @jarno ya lo sabrá. Cada usuario tiene su propia tarea cron, por lo que si la agrega a la de su usuario (ejecutando crontab -e sin sudo) el usuario ejecutará el script. Por lo tanto, debe ejecutarlo como root para permitir que pueda ejecutar scripts como root en el arranque.
eddieferetro
9

Esto funcionó para mí en Ubuntu 17.04:

  1. cree un archivo de guión turístico como disable_cdromconveniente para su ubicación. En mi caso home/yterle/disable_cdrom. En mi caso:

    #!/bin/sh
    eject /dev/sr0 -i 1
  2. hazlo ejecutable chmod 775 disable_cdrom

  3. navegar /etc/systemd/systemy crear allí un servicearchivo. Por ejemplosudo gedit /etc/systemd/system/disable_cdrom.service

Mi disable_cdrom.serviceaspecto es este:

[Unit]
Description=Disable cdrom

[Service]
Type=oneshot
ExecStart=/bin/sh /home/yterle/disable_cdrom

[Install]
WantedBy=multi-user.target

Donde ExecStartpuntos para ejecutar su script con/bin/sh

Luego, ejecute systemctl enable disable_cdrom.servicepara habilitar el servicio systemd

YTerle
fuente
1
Votando esto ya que es lo que estaba buscando, pero creo que te refieressystemctl enable disable_cdrom.service
KennetRunner
5

Incluya su archivo de Script /etc/init.d/ con permiso ejecutable y luego establezca un nivel de ejecución diferente

$ update-rc.d script-name default

Pondrá su script en el inicio de arranque.

MS Parmar
fuente
No me funciona en Kali Linux v2.0. Quiso decir update-rc.d script-name enable?
Sopalajo de Arrierez
update-rc.d <script-name> script de shell predeterminado que ha copiado en /etc/init.d/ <script-name>
MS Parmar
4

Cree un archivo de texto como este en /etc/cron.d/:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

@reboot   root    yourScriptPath

(Debe reemplazar yourScriptPathcon la ruta de acceso al script que desea ejecutar).

jarno
fuente
1

Cuidado con agregar el script a rc.local- me quedé atrapado en la pantalla de bienvenida por eso Al presionar Alt+ se F1reveló lo que estaba sucediendo detrás de la pantalla de inicio (el script se rc.localestaba ejecutando).

No pude salir de eso.

  • Ctrl+ Alt+ Delo
  • Alt+ PrtSc+ Ko
  • Ctrl+ Alt+F#

nada funciona.

Tuve que arrancar desde una imagen USB de Ubuntu, buscar rc.local, darme permisos para archivar y eliminarlo. Supongo que no deberías hacer cosas si no sabes lo que estás haciendo.

Gašper Čefarin
fuente