Systemd non può avviare lo script?


9

Ho uno script BASH che voglio eseguire all'avvio. Il mio sistema esegue systemd, quindi ho creato un file .service con ciò che penso siano le informazioni necessarie:

[Unit]
Description=My Script
After=network.target

[Service]
ExecStart=/home/myscript.sh

[Install]
WantedBy=multi-user.target

Ho usato l'abilitazione di systemctl per "registrarlo" al riavvio. All'avvio mi è stato detto che il mio script sarebbe stato eseguito, ma non riuscivo a vedere nessuno dei messaggi che ECHO doveva visualizzare sullo schermo né scriveva qualcosa su un file, secondo quanto avevo scritto nello script. Inoltre, non avvia l'applicazione che dovrebbe avviarsi.

Lo stato di Systemctl mi dice che lo script è stato eseguito ed è terminato correttamente. Tuttavia, la sceneggiatura non ha alcun effetto. Se eseguo lo script da una shell, funziona perfettamente.

Qualcuno di voi sa quale potrebbe essere il mio problema?


3
Apparentemente, se il tuo script inizia qualcos'altro ha bisogno di "Tipo = biforcazione" Mi sento leggermente stupido per non aver fatto confusione con le impostazioni in precedenza.
TokyoMEWS,

1
+1 per risolverlo. Pubblica la tua soluzione come risposta e accettala per aiutare altre persone con lo stesso problema.
terdon,

1
@TokyoMEWS: Più precisamente, se lo script avvia qualcos'altro ed esce mentre i suoi figli sono in esecuzione, ha bisogno di "Tipo = biforcazione".
user1686

Risposte:


7

Oltre a ciò che TokyoMEWS ha trovato da solo ...

Apparentemente, se il tuo script avvia qualcos'altro ha bisogno di "Tipo = biforcazione"

(che non è completamente corretto - Type=forkingdiventa necessario solo se lo script esce mentre i suoi figli sono in esecuzione )

... altri possibili problemi sono:

  1. Immagino che con "display on screen" intendevi dire che la sceneggiatura scrive semplicemente qualcosa su stdout. Questo non va sullo schermo durante l'avvio - piuttosto, tutto dallo stdout di un servizio viene inviato al journal (o al syslog a seconda della versione del tuo sistema).

  2. Se si ha in realtà tenta scrivere sullo schermo (ad esempio utilizzando echo Hi >/dev/tty1), allora è molto probabile che l'uscita dello script scompare quando agetty pulisce lo schermo prima di mostrare prompt di login. (Per evitarlo, dovresti ordinare l'unità After=getty@tty1.service).

  3. Per scrivere qualcosa su un file, è necessario che il file system sia montato in lettura-scrittura. Per questo, After=local-fs.target potrebbe essere necessario, altrimenti l'unità potrebbe essere riavviata troppo presto. Ma questo dipende dalla specifica configurazione del sistema operativo.


1

Se lo script definisce anche la clausola ExecStop , è necessario impostare " RemainAfterExit = yes" per evitare che ExecStop venga chiamato automaticamente dopo ExecStart . Ciò consentirà al servizio di essere nello stato " attivo " dopo aver eseguito il comando ExecStart .

[Service]
ExecStart=/home/myscript.sh start
ExecStop=/home/myscript.sh stop
RemainAfterExit=yes
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.