Come eseguire uno script durante l'avvio come root


59

Avevo uno script che abilita automaticamente il mio wifi senza usare networkmanager, ma non so come eseguire lo script come root mentre il sistema si sta avviando. Come faccio a eseguire automaticamente lo script durante l'avvio?


I programmi di avvio automatico sono configurati in autostartmanifesti o in *.servicefile in diverse posizioni, nonché in init.do crontab. Guarda questo: unix.stackexchange.com/a/525845/43233
Noam Manos

Risposte:


54

Posizionare lo script che si desidera eseguire nella directory /etc/init.d e renderlo eseguibile.

chmod 755 myscript

Fatto ciò, creare un collegamento simbolico nella directory del livello di esecuzione che si desidera utilizzare, ad esempio se si desidera eseguire un programma nel runlevel grafico 2, il runlevel predefinito per Ubuntu, lo si inserirà nella /etc/rc2.ddirectory. Non è possibile posizionarlo nella directory, è necessario indicare quando verrà eseguito indicando l'avvio con una "S" e l'ordine di esecuzione è importante. Posizionalo dopo tutto il resto della directory assegnandogli un numero più alto.

Se l'ultimo script da eseguire è rc.localed è denominato, S99rc.localè necessario aggiungere lo script come S99myscript.

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

Ogni /etc/rc*.ddirectory compatibile con le versioni precedenti ha collegamenti simbolici alla /etc/init.d/directory.


1
Nota che sotto Ubuntu Server 14.04, dovevo usare /etc/rc2.d, invece di rc3.dcome indicato nell'esempio. Sembra che rc2.dnon sia solo il livello grafico della corsa.
Brad

1
cd /etc/rc`cat /etc/init/rc-sysinit.conf | grep "env DEFAULT_RUNLEVEL" | grep -oP "\d"`.dti porterà in quale /etc/rc?.ddirectory corrisponde al tuo runlevel predefinito.
Kevin,

1
Invece: "Se l'ultimo script da eseguire è rc.localed è denominato, S99rc.localè necessario aggiungere lo script come S99myscript.". Volevi dire: "Se l'ultimo script da eseguire è myscripted è chiamato S99myscriptallora devi aggiungere il tuo script come S99myscript." ???
Dor,

6
Tieni presente che questo non funzionerà con systemd (ovvero, a partire da Ubuntu 16.04). Vedi questo invece.
Alexander Revo,

26

Includi il comando in /etc/rc.local. Verrà eseguito ogni volta che cambia il runlevel dell'utente.

Nota: Devi inserire il comando prima dell'ultima riga in /etc/rc.local che contiene: "exit 0".


3
Nota: devi inserire il comando prima dell'ultima riga /etc/rc.localche contiene: exit 0
rubo77,

3
/etc/rc.localin Ubuntu 15.10 ha commentato che "Questo script viene eseguito alla fine di ogni runlevel multiutente". Quindi lo script potrebbe essere eseguito più volte durante l'avvio, giusto?
jarno,

@jamo, sì, su ogni runlevel. Non so come questo sia correlato all'esecuzione "all'avvio", che di solito significa "esegui una volta all'avvio".
erm3nda,

17

Utilizza crontabun'opzione per eseguire lo script dopo il riavvio,

puoi farlo aggiungendo il @rebootcodice in cron

Apri crontab dall'utente root:

$ sudo crontab -e

Aggiungi il prossimo record in fondo:

@reboot yourScriptPath 

Quello farà quello che vuoi.


Intendevi usare il comando crontab -e, che non ha bisogno dei privilegi di superutente? Mi chiedo se è possibile eseguire script che devono essere eseguiti come root.
jarno,

Ho provato questo. Non esegue lo script come root.
jarno,

4
Devi aggiungere la linea mentre sudo crontab -eesegui il comando per farlo eseguire lo script come root durante l'avvio.
jarno,

non dimenticare di rimuovere /var/run/crond.reboot, in caso contrario, non eseguirà l'attività
Albert Català,

Solo per la cronaca, sono sicuro che @jarno lo saprà già. Ogni utente ha il suo compito cron, quindi se lo aggiungi a quello dell'utente (eseguendo crontab -e senza sudo) lo script verrà eseguito dall'utente. Quindi è necessario eseguirlo come root per consentire l'esecuzione degli script come root all'avvio.
eddieferetro,

9

Questo ha funzionato per me su Ubuntu 17.04:

  1. creare il file di script del tour come disable_cdromnella posizione più comoda per te. Nel mio caso home/yterle/disable_cdrom. Nel mio caso:

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

  3. navigare /etc/systemd/systeme creare lì un servicefile. Per esempiosudo gedit /etc/systemd/system/disable_cdrom.service

Il mio disable_cdrom.serviceassomiglia a questo:

[Unit]
Description=Disable cdrom

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

[Install]
WantedBy=multi-user.target

Dove ExecStartpunta per eseguire lo script/bin/sh

Quindi eseguire systemctl enable disable_cdrom.serviceper abilitare il servizio systemd


1
Votare questo come è quello che stavo cercando, ma penso che intendisystemctl enable disable_cdrom.service
KennetRunner,

5

Includi il tuo file Script /etc/init.d/ con autorizzazione eseguibile, quindi imposta un livello di esecuzione diverso

$ update-rc.d script-name default

Metterà il tuo script all'avvio.


Non funziona per me su Kali Linux v2.0. Volevi dire update-rc.d script-name enable?
Sopalajo de Arrierez,

update-rc.d <script-name> script di shell predefinito che hai copia in /etc/init.d/ <script-name>
MS Parmar

4

Crea un file di testo come questo in /etc/cron.d/:

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

@reboot   root    yourScriptPath

(È necessario sostituire yourScriptPathcon il percorso dello script che si desidera eseguire.)


1

Attento con l'aggiunta della sceneggiatura a rc.local- ero bloccato nella schermata iniziale a causa sua. Premendo Alt+ hai F1rivelato cosa stava succedendo dietro la schermata iniziale (lo script rc.localera in esecuzione).

Non potevo uscirne.

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

niente funziona.

Ho dovuto avviare un'immagine USB Ubuntu, trovare rc.local, concedermi le autorizzazioni per archiviarlo ed eliminarlo. Immagino che non dovresti fare cose se non sai cosa stai facendo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.