Come avviare un'applicazione automaticamente all'avvio


27

Sono nuovo di Linux e non vedo l'ora di iniziare l'applicazione (che attiva un led ogni 10 secondi). Ho scritto il programma applicativo e funziona bene, ma ora voglio avviarlo automaticamente all'avvio.

La documentazione qui dice di copiare lo script di avvio nella /etc/init.ddirectory e creare un collegamento simbolico allo script copiato nella rc.ddirectory.

Quale dovrebbe essere l'estensione e il nome di questi file di script? Possiamo aggiungere manualmente il link simbolico rc.do esiste una procedura specifica per questo?

Qualche suggerimento su come realizzarlo?


Il modo preferito di aggiungere uno script init all'avvio varia in base alle distribuzioni. Alcuni li stanno addirittura eliminando a favore di upstart e systemd. Non consiglierei semplicemente di usare "&" in background, dato che qualcosa come Debian lo start-stop-daemongestisce meglio (anche se preferisce il demonizzazione del programma stesso). Quale distro stai usando? Al di fuori dei tipi MIME desktop, le estensioni dei file sono prive di significato in * nix e si preferisce che gli eseguibili non ne abbiano uno.
Giordania,

Se stai usando petalogix, segui semplicemente quella documentazione - non sono richiesti nomi speciali, fai solo quello che dicono. Hai provato? Che problemi hai? (In caso contrario, specifica la tua distribuzione e spiega cosa non funziona con quello che hai provato.)
Mat

Sto usando Debian "wheezy" per RPi.
gola

1
se è necessario farlo ogni 10 secondi circa (ovvero non 10 secondi di nitidezza), è possibile utilizzare croninvece.
peterph,

@peterph: ma sembra che il programma commuti il ​​LED ogni 10 secondi, non un programma che viene eseguito ogni 10 secondi.
Zorawar,

Risposte:


19

Ecco l'estratto di http://www.debian-administration.org/articles/28 che sembra rispondere alla tua domanda.

Nota: nello script di esempio riportato di seguito è sufficiente aggiungere una chiamata alla sezione " start)" per avviare effettivamente il programma. Puoi testare la funzionalità dello script senza riavviare il sistema: chiamalo con il percorso completo e assegnandogli un parametro di " start" o " stop"

Ecco qui:

Debian usa un sistema Sys-V come init per eseguire comandi quando cambia il runlevel del sistema, ad esempio all'avvio e all'arresto.

Se si desidera aggiungere un nuovo servizio per l'avvio all'avvio della macchina, è necessario aggiungere lo script necessario alla directory /etc/init.d/. Molti degli script già presenti in quella directory ti daranno un esempio del tipo di cose che puoi fare.

Ecco uno script molto semplice che è diviso in due parti, il codice che viene sempre eseguito e il codice che viene eseguito quando viene chiamato con "start" o "stop".

#! /bin/sh
# /etc/init.d/blah
#

# Some things that run always
touch /var/lock/blah

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting script blah "
    echo "Could do more here"
    ;;
  stop)
    echo "Stopping script blah"
    echo "Could do more here"
    ;;
  *)
    echo "Usage: /etc/init.d/blah {start|stop}"
    exit 1
    ;;
esac

exit 0

Dopo aver salvato il file nella posizione corretta, assicurati che sia eseguibile eseguendo " chmod 755 /etc/init.d/blah".

Quindi è necessario aggiungere i collegamenti simbolici appropriati per fare in modo che lo script venga eseguito quando il sistema si arresta o si alza.

Il modo più semplice per farlo è usare il comando specifico di Debian update-rc.d:

root@skx:~# update-rc.d blah defaults
 Adding system startup for /etc/init.d/blah ...
   /etc/rc0.d/K20blah -> ../init.d/blah
   /etc/rc1.d/K20blah -> ../init.d/blah
   /etc/rc6.d/K20blah -> ../init.d/blah
   /etc/rc2.d/S20blah -> ../init.d/blah
   /etc/rc3.d/S20blah -> ../init.d/blah
   /etc/rc4.d/S20blah -> ../init.d/blah
   /etc/rc5.d/S20blah -> ../init.d/blah

devo effettivamente posizionare questo script in etc / init.d / o la riga in alto, # /etc/init.d/blah, indica una posizione nella shell?
user137717

Ricevo "-sh: update-rc.d: comando non trovato"
m4l490n

2
I sistemi più recenti utilizzano systemdmolte cose, inclusa la configurazione di avvio. Utilizzare systemctlper controllare e configurare systemd.
Alexander Shcheblikin,

4

Il modo migliore è controllare l'origine del pacchetto della tua distribuzione per un servizio di sistema regolare, ad esempio per OpenSSH: vedrai quali sono le buone pratiche. Dopotutto, uno dei motivi alla base dell'open source è quello di poter imparare dalle fonti.


2
Ottimo consiglio! Veramente saggio e pertinente, e sintonizzato su tutte le Distos. (E per inciso risponde alla parte "nuova di Linux" e "come faccio" della domanda.
Userò

3

Utilizzare Supervisor, un programma efficace che gestisce e registra le applicazioni di avvio con argomenti. Ulteriori informazioni da http://supervisord.org/running.html e (seguire le istruzioni di installazione.

Crea un file conf su /etc/supervisor/conf.d/{PROGRAM_NAME}.confe qui è il codice,

[program:{PROGRAM_NAME}]
command=/usr/bin/{PROGRAM_NAME} -arg1 -arg2
autostart=true  
autorestart=true  
stderr_logfile=/var/log/supervisor/{PROGRAM_NAME}.err.log  
stdout_logfile=/var/log/supervisor/{PROGRAM_NAME}.out.log  

Quindi eseguire dalla riga cmd:

supervisorctl reload


Mentre la tua risposta va bene, penso che dovresti cambiarla per mostrare che "supervisorctl reload" deve essere eseguito dalla CLI, non per essere inserito nel file .conf
dlewin

3

L'uso crontabè molto più semplice.

Utilizzare crontab -eper modificare il crontab dell'utente.
Aggiungi la seguente riga alla fine:

@reboot <command>

Esempi:

  • @reboot my_script.sh
  • @reboot python my_script.py arg1 arg2

Infine, utilizza crontab -lper assicurarti che il tuo script sia stato aggiunto all'elenco.


Mi chiedo perché questa risposta abbia ricevuto voti negativi? Sembra una soluzione molto semplice, che utilizza crontab, che probabilmente tutti già conoscono e comprendono.
Kolinko,

1

Versioni più recenti di supporto linux systemd(come ha detto @AlexanderShcheblikin). Ha più funzionalità ed è più portabile della soluzione specifica per Debian.

Si prega di leggere questa guida davvero eccezionale .

Ecco un rapido riferimento al minimo indispensabile:

  1. Uno script (ad esempio myscript.sh) con autorizzazioni eseguibili.
  2. Un file di unità (ad es. myservice.service) Con estensione ".service" /etc/systemd/systemcon permessi 644 che contiene il comando per eseguire lo script. Per esempio,

:

[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/bin/bash /path/to/myscript.sh

[Install]
WantedBy=multi-user.target
  1. Esegui il comando sudo systemctl enable myserviceper abilitarlo all'avvio.
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.