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?
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.
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".
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,
¿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:
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
hazlo ejecutable chmod 775 disable_cdrom
navegar /etc/systemd/systemy crear allí un servicearchivo. Por ejemplosudo gedit /etc/systemd/system/disable_cdrom.service
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.
autostart
manifiestos o en*.service
archivos en varias ubicaciones, así como eninit.d
ocrontab
. Vea esto: unix.stackexchange.com/a/525845/43233Respuestas:
Coloque el script que desea ejecutar en el directorio /etc/init.d y haga que el script sea ejecutable.
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.d
directorio. 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.local
y se nombra,S99rc.local
entonces debe agregar su script comoS99myscript
.Cada
/etc/rc*.d
directorio compatible con versiones anteriores tiene enlaces simbólicos al/etc/init.d/
directorio.fuente
/etc/rc2.d
, en lugar derc3.d
como se indica en el ejemplo. Parecerc2.d
que no es solo el nivel de ejecución gráfica.cd /etc/rc`cat /etc/init/rc-sysinit.conf | grep "env DEFAULT_RUNLEVEL" | grep -oP "\d"`.d
lo llevará a qué/etc/rc?.d
directorio corresponde a su nivel de ejecución predeterminado.rc.local
y se nombra,S99rc.local
entonces debe agregar su script comoS99myscript
". ¿Quiso decir: "Si el último script que se ejecuta esmyscript
y se nombra,S99myscript
entonces debe agregar su script comoS99myscript
"?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".
fuente
/etc/rc.local
que contiene:exit 0
/etc/rc.local
en 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?Use una
crontab
opción para hacer que su script se ejecute después de reiniciar,puedes hacerlo agregando
@reboot
código en cronAbrir crontab por usuario root:
Agregue el siguiente registro en la parte inferior:
Eso hará lo que quieras.
fuente
crontab -e
, que no necesita privilegios de superusuario? Me pregunto si puede ejecutar scripts que deben ejecutarse como root.sudo crontab -e
para que ejecute el script como root durante el inicio./var/run/crond.reboot
, si no, no se ejecutará la tareaEsto funcionó para mí en Ubuntu 17.04:
cree un archivo de guión turístico como
disable_cdrom
conveniente para su ubicación. En mi casohome/yterle/disable_cdrom
. En mi caso:hazlo ejecutable
chmod 775 disable_cdrom
/etc/systemd/system
y crear allí unservice
archivo. Por ejemplosudo gedit /etc/systemd/system/disable_cdrom.service
Mi
disable_cdrom.service
aspecto es este:Donde
ExecStart
puntos para ejecutar su script con/bin/sh
Luego, ejecute
systemctl enable disable_cdrom.service
para habilitar el servicio systemdfuente
systemctl enable disable_cdrom.service
Incluya su archivo de Script
/etc/init.d/
con permiso ejecutable y luego establezca un nivel de ejecución diferentePondrá su script en el inicio de arranque.
fuente
update-rc.d script-name enable
?Cree un archivo de texto como este en
/etc/cron.d/
:(Debe reemplazar
yourScriptPath
con la ruta de acceso al script que desea ejecutar).fuente
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 serc.local
estaba ejecutando).No pude salir de eso.
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.fuente