Come eseguire uno script di shell all'avvio


367

Su un'istanza di Amazon S3 Linux, ho due script chiamati start_my_appe stop_my_appche si avviano e si fermano per sempre (che a sua volta esegue la mia applicazione Node.js). Uso questi script per avviare e arrestare manualmente la mia applicazione Node.js. Fin qui tutto bene.

Il mio problema: voglio anche configurarlo in modo che start_my_appvenga eseguito ogni volta che il sistema si avvia. So che devo aggiungere un file all'interno init.de so come collegarlo alla directory corretta all'interno rc.d, ma non riesco a capire cosa debba effettivamente andare all'interno del file che inserisco init.d. Sto pensando che dovrebbe essere solo una linea, tipo start_my_app, ma non ha funzionato per me.


5
Non sono esperto in questo genere di cose, ma penso che la init.dsoluzione ( qui ) dovrebbe essere preferita alla rc.localsoluzione perché quest'ultima è la vecchia attrezzatura che è ancora utilizzabile solo perché la nuova attrezzatura è retrocompatibile.
erikbwork,

pm2 avvia my_app; avvio pm2; pm2 salva github.com/Unitech/pm2
Unitech il

Risposte:


292

Nel file che hai inserito /etc/init.d/devi impostarlo come eseguibile con:

chmod +x /etc/init.d/start_my_app

Grazie a @meetamit, se questo non funziona devi creare un link simbolico a /etc/rc.d/

ln -s /etc/init.d/start_my_app /etc/rc.d/

Nota che l'ultima versione di Debian non funzionerà poiché lo script deve essere conforme a LSB (fornire almeno le seguenti azioni: avvio, arresto, riavvio, ricarica forzata e stato): https: //wiki.debian .org / LSBInitScripts

Come nota, dovresti inserire il percorso assoluto del tuo script anziché uno relativo, potrebbe risolvere problemi imprevisti:

/var/myscripts/start_my_app

E non dimenticare di aggiungere sopra quel file:

#!/bin/sh

6
l'ho fatto e non ha funzionato. verrà eseguito automaticamente solo perché è in /etc/init.d o devo fare qualcosa in cima per programmarlo per l'avvio all'avvio del sistema?
anfibio,

4
@amphibient Non abbastanza ... Devi anche creare un link simbolico a questo file (usando il lncomando) a una directory all'internorc.d
meetamit

23
non c'è una directory rc.d nella cartella etc della mia radice .. questo mi ha sbalordito non è questa una directory cruciale di cui Linux ha bisogno per avviarsi? Manca solo un mio sistema operativo sembra funzionare bene. Devo crearlo? Vedo un sacco di file con nomi simili come "rc1.d" fino a "rc5.d"
OKGimmeMoney,

3
Non ho alcuna /etc/rc.dcartella, ma ho /etc/rcX.dcartelle (Ie /etc/rc0.d , /etc/rc1.d , /etc/rcS.d ), inoltre c'è un file /etc/rc.local . Penso che dovresti creare collegamenti simbolici in una cartella personalizzata come /etc/rc9.do in uno di quelli esistenti ... (Ubuntu Server 14.04)
F8ER,

2
Questa domanda mi ha aiutato con questo: unix.stackexchange.com/questions/28679/…
seth10

344

Imposta un crontab per questo

#crontab -e
@reboot  /home/user/test.sh

dopo ogni avvio eseguirà lo script di test.


4
Questa è l'unica soluzione che ha funzionato per me senza problemi! grazie
whoopididoo

20
Questa è la soluzione migliore, @reboot sh $HOME/test.shnel crontab è ancora più pulita
user3667089

4
@ user3667089 in realtà, non funziona. Apro il terminale, inserisco "crontab -e", appare una finestra, in cui scrivo in "@reboot sh /home/user/test.sh" ma non viene eseguito all'avvio. Dove sto sbagliando?
MycrofD,

1
@utente3667089 le solite righe predefinite '# Modifica questo file in ...' e poi la riga che ho scritto '@reboot sh /home/.../.sh'. Ho anche provato '@reboot /home/.../.sh' senza "sh" iniziale ma senza risultati.
MycrofD,

3
@MycrofD crontab -ldovresti mostrare @reboot sh $HOME/test.shper confermare che è stato effettivamente impostato.
user3667089,

124

Un approccio semplice è quello di aggiungere una riga in /etc/rc.local:

/PATH/TO/MY_APP &

o se si desidera eseguire il comando come utente speciale:

su - USER_FOOBAR -c /PATH/TO/MY_APP &

(la e commerciale finale fa da sfondo al processo e consente a rc.local di continuare l'esecuzione)

Se vuoi uno script init completo, la distro debian ha un file modello, quindi:

cp /etc/init.d/skeleton /etc/init.d/your_app

e adattalo un po '.


2
Grazie! Questo approccio ha funzionato meglio dati i semplici requisiti. Sono abbastanza sicuro di aver bisogno di specificare l'utente, altrimenti quando stop_my_appdovrei interrompere manualmente l'app (eseguendo ) dovrei farlo con sudo, no? Inoltre, mi chiedo quale sia esattamente la funzione della e commerciale finale (?).
Meetamit

3
L'utente dipende dalla tua app. Ma se non è assolutamente necessario eseguire come root, evitarlo. &eseguire il processo in background
Gilles Quenot,

2
sputnick, scusa, ma devo contrassegnare Koren come la risposta accettata, principalmente a causa di ciò che @ erikb85 ha sottolineato, ma anche perché la mia domanda originale mi ha chiesto il init.dmodo di fare le cose (la tua risposta era solo una soluzione più semplice per me al momento) . Questo post ottiene molte visualizzazioni e voti, quindi è importante essere precisi.
Meetamit

4
Sembra che non sia stato detto che la e commerciale finale fa da sfondo al processo e consente a rc.local di continuare l'esecuzione.
mchicago,

Grazie per questo! Ho trascorso le ultime ore a sbattere la testa contro il muro mentre cercavo di fare un servizio, ma niente ha funzionato. Ho provato questo, funziona come un fascino!
Marko Grešak,

35

Questo è il modo in cui lo faccio su Red Hat Linux sistemi .

Inserisci il tuo script /etc/init.d, di proprietà di root ed eseguibile. Nella parte superiore dello script, puoi dare una direttiva perchkconfig . Esempio, il seguente script viene utilizzato per avviare un'applicazione Java come oracolo utente.

Il nome della sceneggiatura è /etc/init.d/apex

#!/bin/bash
# chkconfig: 345 99 10
# Description: auto start apex listener
#
case "$1" in
 'start')
   su - oracle -c "cd /opt/apex ; java -jar apex.war > logs/apex.log 2>logs/apex_error.log &";;
 'stop')
   echo "put something to shutdown or kill the process here";;
esac

Questo dice che lo script deve essere eseguito ai livelli 3, 4 e 5 e la priorità per start / stop è 99 e 10.

Quindi, come utente rootè possibile utilizzare chkconfigper abilitare o disabilitare lo script all'avvio:

chkconfig --list apex
chkconfig --add apex

E puoi usare service start/stop apex.


Nel frattempo ho sperimentato un pacchetto chiamato supervisord ( supervisord.org ) che è disponibile nel repository epel. Può essere utilizzato per avviare programmi e monitorarli, riavviandoli in caso di errore.
Saule,

Invece di digitare: "chkconfig --add nome_servizio" dopo aver inserito lo script nella cartella /etc/init.d/ è possibile digitare: "chkconfig nome_servizio su"
Dragan Radevic

23

Accedi cronusando sudo:

sudo crontab -e

Aggiungi un comando da eseguire all'avvio, in questo caso uno script:

@reboot sh /home/user/test.sh

Salva:

Premi ESC quindi: x per salvare ed uscire, oppure premi ESC quindi ZZ (ovvero maiusc + zz)

Test Test Test :

  1. Esegui lo script di test senza cron per assicurarti che funzioni davvero.

  2. Assicurati di aver salvato il tuo comando in cron, usa sudo crontab -e

  3. Riavvia il server per confermare che tutto funzioni sudo @reboot


Questo mi piace molto. Grazie! Ps. non utilizzare sudose si desidera eseguire un determinato comando durante l'avvio utilizzando l'utente corrente.
danger89

Dove dovrebbero essere archiviate queste informazioni? Non in /tmp??
Peter Mortensen il

15

Basta aggiungere una riga al tuo crontab ..

Assicurarsi che il file sia eseguibile:

chmod +x /path_to_you_file/your_file

Per modificare il file crontab:

crontab -e

Riga che devi aggiungere:

@reboot  /path_to_you_file/your_file

Così semplice!


Questo non funziona per me, mi manca qualcosa? # uname -a Linux accton-xp70a0-26-a1 3.11.10-301.fc20.x86_64 #1 SMP Thu Dec 5 14:01:17 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

Questo ha funzionato per me su CentOs 7. Per quelli con problemi, avevo bisogno di creare uno script shell, renderlo eseguibile (chmod + x nome_file) e chiamare lo script shell dal cron che a sua volta chiama il nodo path_to_file / index.js
SeanOlson,

11

Un'altra opzione è avere un comando @reboot nel tuo crontab.

Non tutte le versioni di cron supportano questo, ma se la tua istanza è basata sull'AMI Amazon Linux, allora funzionerà.


6

Puoi farlo :

chmod +x PATH_TO_YOUR_SCRIPT/start_my_app 

quindi utilizzare questo comando

update-rc.d start_my_app defaults 100

Si prega di consultare questa pagina su Cyberciti .


1
Ho una configurazione piuttosto barebone, costruita su yocto e questo era l'unico modo per far funzionare il mio script. Grazie.
Catalin Vasile,

3

Crea il tuo eseguibile / init

Questo non è quello che vuoi, ma è divertente!

Basta scegliere un file eseguibile arbitrario, anche uno script di shell , e avviare il kernel con il parametro della riga di comando:

init=/path/to/myinit

Verso la fine dell'avvio, il kernel di Linux esegue il primo eseguibile di spazio utente nel percorso indicato.

Diversi progetti forniscono popolare init eseguibili utilizzati dalle principali distribuzioni, ad esempio systemd, e nella maggior parte delle distribuzioni init eseguirà una serie di processi utilizzati nel normale funzionamento del sistema.

Ma possiamo dirottarlo /initper eseguire i nostri script minimi per comprendere meglio il nostro sistema.

Ecco un'impostazione riproducibile minima: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/f96d4d55c9caa7c0862991025e1291c48c33e3d9/README.md#custom-init


2

Questa semplice soluzione ha funzionato per me su un'istanza di Amazon Linux con CentOS. Modifica il tuo /etc/rc.d/rc.localfile e inserisci il comando lì. In questo file viene menzionato che verrà eseguito dopo tutti gli altri script init. Quindi stai attento a questo proposito. Ecco come il file mi cerca attualmente. inserisci qui la descrizione dell'immagine. L'ultima riga è il nome della mia sceneggiatura.


1

Il metodo più semplice in assoluto se tutto ciò che vuoi eseguire è uno script semplice (o qualsiasi altra cosa) è se hai una GUI per usare le preferenze di sistema> quindi le app di avvio.

basta cercare lo script desiderato e il gioco è fatto. (rendere eseguibile lo script)


3
Questo in realtà non funziona all'avvio, ma al login, che è una differenza abbastanza grande. Dipende anche da una determinata configurazione poiché non avrai "Sistema> Preferenze" su tutti i sistemi (specialmente non sui server).
jazzpi,

il termine di ricerca "esegui linux all'avvio" mi ha portato a questa risposta, che cercavo. Anche se non risponde alla domanda di OP, questo potrebbe aiutare i Linux noub come me, quindi merita un voto positivo. Neanche a me piace, ma questo è pragmatismo.
thymaro,


1

In Lubuntu ho dovuto affrontare la situazione opposta. Skype inizia a funzionare dopo l'avvio e l'ho trovato nel ~/.config/autostart/file skypeforlinux.desktop. Il contenuto del file è il seguente:

[Desktop Entry]
Name=Skype for Linux
Comment=Skype Internet Telephony
Exec=/usr/bin/skypeforlinux
Icon=skypeforlinux
Terminal=false
Type=Application
StartupNotify=false
X-GNOME-Autostart-enabled=true

L'eliminazione di questo file mi ha aiutato.


0
  • Aggiungi il tuo script alla directory /etc/init.d/
  • Aggiorna i tuoi livelli di esecuzione rc: $ update-rc.d myScript.sh defaults NNdove NN è l'ordine in cui dovrebbe essere eseguito. 99 per esempio significa che verrebbe eseguito dopo 98 e prima di 100.

0

Lavorare con microservizi o shell Python 3; usando Ubuntu Server 18.04 (Bionic Beaver) o Ubuntu 19.10 (Eoan Ermine) o Ubuntu 18.10 (Cosmic Cuttlefish) mi piacciono sempre questi passaggi e ha funzionato sempre :

  1. Creare un microservizio chiamato p esempio "brain_microservice1.service" nel mio caso:

    $ nano /lib/systemd/system/brain_microservice1.service
  2. All'interno di questo nuovo servizio in cui ti trovi:

    [Unit]
    Description=brain_microservice_1
    After=multi-user.target
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices    /microservice_1.py -k start -DFOREGROUND
    ExecStop=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful-stop
    ExecReload=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful
    PrivateTmp=true
    LimitNOFILE=infinity
    KillMode=mixed
    Restart=on-failure
    RestartSec=5s
    
    [Install]
    WantedBy=multi-user.target
  3. Dare le autorizzazioni:

    $ chmod -X /lib/systemd/system/brain_microservice*
    $ chmod -R 775 /lib/systemd/system/brain_microservice*
  4. Dare il permesso di esecuzione quindi:

    $ systemctl daemon-reload
  5. Abilita quindi, questo farà quindi iniziare sempre all'avvio

    $ systemctl enable brain_microservice1.service
  6. Quindi puoi provarlo;

    $ sudo riavvia ora

  7. Finitura = SUCCESSO !!

Questo può essere fatto con lo stesso script body per eseguire shell, reagire ... script di avvio del database ... qualsiasi tipo di codice os ... spero che questo ti aiuti ...

...



0

Ecco un metodo più semplice!

Primo: scrivere uno script di shell e salvarlo in .sh ecco un esempio

#!/bin/bash
Icoff='/home/akbar/keyboardONOFF/icon/Dt6hQ.png'
id=13
fconfig=".keyboard"
echo "disabled" > $fconfig
xinput float $id
notify-send -i $Icoff "Internal Keyboard disabled";

questo script disabiliterà la tastiera interna all'avvio.

Secondo: Aprire l'applicazione "Preferenze dell'applicazione di avvio"

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Terzo: fai clic su Aggiungi. quarto: nella sezione NOME dare un nome. quinto: nella sezione comandi vai al tuo .sh. sesto: modifica la sezione comandi in:

bash <space> path/to/file/<filename>.sh <space> --start

settimo: fare clic su Aggiungi. Questo è tutto! Finito!

Ora conferma riavviando il PC.

Saluti!


-1

Il metodo indolore, più semplice e universale è semplicemente eseguirlo con ~.bash_profileo ~.profile (se non si dispone del file bash_profile) .

Basta aggiungere il comando di esecuzione nella parte inferiore di quel file e verrà eseguito all'avvio del sistema.

Ho questo in fondo un esempio; ~\Desktop\sound_fixer.sh


2
Questo è inaccurato. ~/.bash_profileviene eseguito quando l'utente accede, non all'avvio del sistema. Nella domanda originale, l'intento è quello di eseguire un server app Node.js all'avvio della macchina. La soluzione richiederebbe a un utente umano di accedere prima al computer prima dell'esecuzione del server Node.js. E, se un qualche tipo di problema provoca un riavvio del server durante la notte, l'app non tornerà in vita fino a quando l'essere umano non
accederà di

-6

Per alcune persone, questo funzionerà:

Puoi semplicemente aggiungere il seguente comando in SistemaPreferenzeApplicazioni di avvio :

bash /full/path/to/your/script.sh

Non vedo questo nel menu delle preferenze di sistema. Ma lo vedo quando cerco nel programma di avvio dell'applicazione.
OK Dammi,

Questo in realtà non funziona all'avvio, ma al login, che è una differenza abbastanza grande. Dipende anche da una determinata configurazione poiché non avrai "Sistema> Preferenze" su tutti i sistemi (specialmente non sui server).
jazzpi,

3
Questa risposta sembra più per desktop Ubuntu / Linux, ma l'utente sta effettivamente chiedendo aiuto per un'istanza Linux AWS EC2, che per quanto ne so, non ha una GUI.
Vini.g.fer
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.