Come posso eseguire il comando all'avvio (alternativa a rc.local) su Ubuntu 16.10


49

Sto impostando la quota sul mio server Linode con Ubuntu 16.10 e ottengo il seguente errore

Impossibile installare stat () dispositivo / dev / root: nessun file o directory

Quindi, per risolvere questo problema, ho raggiunto questo thread per la correzione che viene eseguita aggiungendo

ln -s /dev/xvda /dev/root
/etc/init.d/quota restart

al /etc/rc.local. Ma Ubuntu 16.10 non usa rc.localpiù invece usa systemd . Qual è l'alternativa per rc.local, come posso eseguire i comandi sopra all'avvio?

Inoltre ho abilitato il servizio utilizzando systemctl enable rc-local.servicema non ha funzionato per me. Qualsiasi vantaggio sarebbe apprezzato.


lo hai eseguito come root e hai riavviato il tuo sistema?
George Udosen,

@George sì, ho fatto entrambe le cose
Saurabh Sharma,


@George Non funziona altrettanto bene
Saurabh Sharma,

Ho appena visto questo trucco, vedi se vola ...
George Udosen,

Risposte:


65

Intro

Penso che non dovresti creare un nuovo servizio come suggerito nel link di George. Il rc-local.serviceesiste già nel systemd e il file di servizio suggerisce che la rc.local, se esiste ed è eseguibile, viene tirato automaticamentemulti-user.target . Quindi non c'è bisogno di ricreare o forzare qualcosa che è appena fatto in un altro modo dal systemd-rc-local-generator.

Una soluzione

Una soluzione rapida (non so se è il modo canonico):

In un terminale fare:

printf '%s\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local
sudo reboot

Successivamente rc.localverrà chiamato all'avvio del sistema. Inserisci quello che vuoi.

sfondo

Se lo fai in un terminale:

sudo systemctl edit --full rc-local

Puoi vedere che il commento principale contiene righe come:

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.

Ciò indica che in questo sistema, se esiste un file chiamato /etc/rc.localche è eseguibile, verrà automaticamente inserito in multi-user.target. Quindi basta creare il file secondo ( sudo touch...) e renderlo eseguibile ( sudo chmod +x ...).


4
Non usare #!/bin/bashperò, usa a #!/bin/shmeno che tu non abbia davvero bisogno di bash nel tuo script. Tutti gli altri script di sistema usano trattino, non bash, per motivi di prestazioni.
spikyjt,

"Non c'è bisogno di ricreare o forzare qualcosa che è appena fatto in un altro modo dal generatore di sistema-rc-local" rc-localnon consente di ordinarlo dopo qualche altra unità, non è vero?
x-yuri,

20

Ho visto questa soluzione suggerita che prevede l'uso di systemd qui :

  1. Crea un servizio:

    sudo vi /etc/systemd/system/rc-local.service
    
  2. Aggiungi il tuo codice lì:

    [Unit]
    Description=/etc/rc.local Compatibility
    ConditionPathExists=/etc/rc.local
    
    [Service]
    Type=forking
    ExecStart=/etc/rc.local start
    TimeoutSec=0
    StandardOutput=tty
    RemainAfterExit=yes
    SysVStartPriority=99
    
    [Install]
    WantedBy=multi-user.target
    
  3. Crea e assicurati che /etc/rc.localsia eseguibile e aggiungi questo codice al suo interno:

    sudo chmod +x /etc/rc.local

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    
    exit 0
    
  4. Abilita il servizio:

    sudo systemctl enable rc-local
    
  5. Avvia il servizio e verifica lo stato:

    sudo systemctl start rc-local.service
    sudo systemctl status rc-local.service
    
  6. Se tutto va bene puoi aggiungere il tuo codeal /etc/rc.localfile quindi riavviarlo.

Nota: testato su Lubuntu 16.10.

Fonte:

https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd


Ho fatto tutti i passaggi. Ho il rc.local con: touch "hello"prima del exit 0. Il servizio sembra essere attivo ma non crea alcun file in / etc / dir In esecuzione su Ubuntu 16.04 Arabian 5.31
Danny182

Come sottolinea la risposta di @Jan, la creazione di un servizio completamente nuovo non è necessaria in quanto systemd supporta già rc.local.
TommyPeanuts,

Grazie a teuuuuuuuuuuuuuuuuuuu, questo funziona e basta
GPrathap

2

Aggiungere alla risposta di Jan che, a differenza del solito rc.localfile, rc-local serviceviene eseguito non dopo che tutti i servizi sono stati avviati, ma dopo che la rete è online.

In alcuni casi potresti voler eseguire i comandi in un rc.localsecondo momento. Ad esempio, volevo che fosse eseguito dopo l' lxdavvio.

In questo caso è possibile modificare rc-local servicele dipendenze di avvio creando un file conf drop-in: /etc/systemd/system/rc-local.service.d/override.conf con contenuto:

[Unit]
After=network.target lxd.service

Dove puoi aggiungere un nome di unità necessario (come ho aggiunto lxd.service)

Non dimenticare di systemctl daemon-reloaddopo.


Benvenuti in Ask Ubuntu! Se vuoi migliorare un'altra risposta, suggeriscigli una modifica. Se si desidera presentare un'alternativa parziale, ripetere o citare le parti uguali (nel caso in cui la risposta originale cambi) ed evidenziare le differenze. In ogni caso non creare una nuova risposta incompleta ! Grazie.
David Foerster,
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.