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.