Come avviare automaticamente i servizi all’avvio in RHEL / CentOS 7?

Ti chiedi come gestire i servizi in background o all’avvio?


Il meccanismo per la gestione e l’avvio dei processi all’avvio è stato modificato. Fino a RHEL / CentOS 6.x, avresti creato uno script in /etc/init.d/ e abilitato con l’aiuto di chkconfig ma le cose sono diverse su RHEL 7.

È sostituito da systemd e poiché è più o meno il gestore dei processi predefinito nelle principali versioni di Linux, l’amministratore di sistema esperto in altre versioni si sentirà come a casa. In questo articolo, esploreremo cos’è systemd, quali sono stati i motivi dello switch e come utilizzare systemd per impostare, eseguire e gestire i processi in background con esso.

Cosa è systemd?

Poiché ogni processo in Linux è chiaramente visibile, vediamo dove si nasconde systemd. Sul mio sistema, ottengo quanto segue:

~ $ ps -ef | grep systemd
root 1 0 0 Nov11? 00:01:02 / lib / systemd / systemd –system –deserialize 22
messaggio + 768 1 0 Nov11? 00:05:46 / usr / bin / dbus-daemon –system –address = systemd: –nofork –nopidfile –systemd-activation –syslog-only
radice 805 1 0 Nov11? 00:10:22 / lib / systemd / systemd-logind
ankush 1132 1 0 Nov11? 00:00:00 / lib / systemd / systemd –user
ankush 1176 1132 0 Nov11? 00:04:50 / usr / bin / dbus-daemon –session –address = systemd: –nofork –nopidfile –systemd-activation –syslog-only
ankush 9772 20029 0 21:11 pts / 6 00:00:00 grep –color = auto systemd
systemd + 17298 1 0 Nov19? 00:00:12 / lib / systemd / systemd-risolto
systemd + 17303 1 0 Nov19? 00:00:00 / lib / systemd / systemd-timesyncd
root 17307 1 0 Nov19? 00:00:02 / lib / systemd / systemd-journald
root 18182 1 0 Nov19? 00:00:00 / lib / systemd / systemd-udevd

Scommetto che l’hai notato all’istante. il primo processo nell’elenco è stato avviato come utente root e ha il pid 1.

Abbastanza sicuro, questo è stato il primo processo che il sistema ha avviato all’avvio. Saluta Systemd. ��

Quindi, molto semplicemente, systemd è il processo “madre” che avvia, gestisce e termina altri processi nel sistema, oltre a fornire informazioni sulla loro registrazione, stati del filesystem, ecc..

Una nota sul nome, però. Il nome è davvero systemd e non System D o qualsiasi altra cosa. La “d” sta per demone, un processo Linux standard che funziona (in agguato?) In background e non è collegato a nessuna sessione terminale.

Perché RHEL è passato a systemd?

Come già discusso, systemd è un gestore di sistema e di processo e in RHEL 7 sostituisce il noto programma Upstart. Perché RHEL (Oracle?) Ha preso questa decisione? Bene, ci sono ottime ragioni per questo, quindi diamo un’occhiata veloce.

Inizializzazione del servizio parallelo

Non mi piace il programma init SysV, systemd è in grado di avviare servizi in parallelo. Il programma init, al contrario, li lancia uno per uno. In un’era in cui anche i dispositivi mobili hanno CPU multi-core, la mancanza di inizializzazione parallela è un grande cambiamento.

Gestione dinamica del servizio (a caldo)

Se hai notato che le unità USB devono essere esplicitamente montate su sistemi Fedora precedenti mentre si aprono automaticamente su Ubuntu e distribuzioni simili, il motivo è systemd. È in grado di rilevare modifiche in tempo reale nell’hardware e terminare / avviare i servizi secondo necessità. Alcuni possono sostenere che non è necessario, ma per molti, tutto ciò che riduce il carico cognitivo è il benvenuto.

Avvio del servizio differito

systemd riduce i tempi di avvio in quanto è in grado di posticipare l’avvio del servizio a quando è effettivamente necessario. Un semplice esempio sono i servizi relativi al file system di rete. Se non è disponibile alcun disco di rete, non ha senso avere un servizio attivo e funzionante.

Comunicazione di processo più rapida

Le capacità parallele di systemd si ripercuotono sulla comunicazione tra processi. systemd è in grado di offrire un accesso parallelo a socket e bus di sistema, riducendo significativamente i tempi di attesa del processo per le risorse di comunicazione.

Riavvio automatico

Se un servizio si arresta in modo anomalo, systemd può rilevarlo e tentare di riavviarlo. Il più delle volte, è sufficiente un semplice riavvio per il riavvio di un’applicazione, a meno che non vi siano problemi fondamentali.

Comunque, systemd semplifica la vita di un amministratore di sistema qui.

systemd in RHEL7 – Cosa cambia per amministratori di sistema?

Se hai la sensazione fastidiosa che systemd non sarà tutto campane e fischietti, hai ragione. Esistono alcune incompatibilità significative che possono sorprendere di sorpresa il sistema RHEL. Diamo una rapida occhiata.

Supporto runlevel limitato

systemd ha un riconoscimento e un supporto piuttosto squallidi per i runlevel. Non tutti i runlevel sono supportati e per alcuni target potrebbe anche non essercene nessuno. In tali casi, systemd restituisce “N” come risposta ai comandi del runlevel, indicando che non ha un runlevel corrispondente a questo target. Tutto sommato, Red Hat ci consiglia di non usare (!) I comandi runlevel.

Nessun comando personalizzato

Questo farà male. Un grande vantaggio di SysV è stata la capacità di definire comandi personalizzati per fornire una migliore funzionalità per la gestione dei processi. Con systemd, non esiste tale opzione e sei bloccato con avvio, arresto, stato, riavvio, ecc.

Solo per famiglie e non interattivo

systemd (ovviamente) tiene traccia dei processi che ha avviato e memorizza i loro PID. La sfida, tuttavia, è che systemd non può gestire i processi non avviati da esso. Inoltre, non è possibile per un utente interagire con un processo avviato da systemd. Tutto l’output va a / dev / null, mettendo effettivamente fine alle speranze che potresti avere di catturare l’output.

Nessun contesto

A differenza dei servizi di init, quelli lanciati da systemd non ereditano alcun ambiente da alcun utente nel sistema. In altre parole, informazioni come PATH e altre variabili di sistema non sono disponibili e ogni nuovo processo viene avviato in un contesto vuoto.

Se questo elenco di limitazioni ti fa piangere, di nuovo, non sei solo. systemd è stata una forza polarizzante nel mondo Linux e Google su “systemd fa schifo” scoprirà molto materiale di lettura. ��

Come avviare il servizio automaticamente quando non funziona?

Ecco un caso d’uso piuttosto comune nelle distribuzioni. Dobbiamo demonizzare un programma in una lingua che non ha processi di lunga durata: PHP! Supponiamo che io scriva uno script PHP per gestire le connessioni socket web in entrata (dopotutto abbiamo creato un’app di chat!) E lo script si trova in /home/ankush/chat_server/index.php.

Poiché le connessioni al websocket possono colpire il server in qualsiasi momento, questo processo deve essere sempre attivo e monitorare le connessioni in entrata. Non possiamo avere il tradizionale ciclo di vita di PHP qui perché i WebSocket sono connessioni con stato e se lo script muore, la connessione è un elenco. Comunque, abbastanza su websocket; vediamo come andremo a demonizzare questo script tramite systemd.

Tutti i servizi di systemd risiedono in / etc / systemd / system, quindi creiamo un file lì per descrivere lo script del nostro server Web. Supponendo di aver effettuato l’accesso come utente root.

# vi /etc/systemd/system/chat_server.service

e quindi è necessario quanto segue.

[Unità]
Descrizione = Servizio server chat
Dopo = network.target

[Servizio]
Tipo = semplice
Utente = Yankash
ExecStart = php /home/ankush/chat_server/index.php
Restart = on-abort

[Installare]
WantedBy = multi-user.target

Salvare il file e il passaggio successivo è ricaricare il demone systemd

# systemctl daemon-reload

e per avviare il servizio che abbiamo appena creato:

# systemctl avvia chat_server

Se non vedi errori, è quello!

Diamo anche un’occhiata a cosa significano le varie direttive nel file:

  • La parte [Unità] definisce una nuova unità di servizio per systemd. Nel linguaggio sistemico, tutti i servizi sono noti come unità di servizio.
  • La direttiva After (prevedibilmente) dice a systemd di lanciare questo servizio solo dopo l’avvio dei servizi di rete (altrimenti, chi eseguirà la gestione di livello inferiore delle connessioni socket ?!).
  • Type = simple indica a systemd che questo servizio non dovrebbe biforcarsi. In altre parole, verrà eseguita solo un’istanza in un dato momento.
  • Utente = ankush significa che questo servizio verrà eseguito come l’utente “ankush”. Potremmo cambiarlo in “root”, ma è altamente sconsigliato dal punto di vista della sicurezza.
  • ExecStart, come puoi vedere, è il comando effettivo da eseguire.
  • Restart = on-abort significa che il servizio deve essere riavviato quando si interrompe. In PHP, i processi di lunga durata perdono memoria e alla fine esplodono, quindi è necessario.
  • La direttiva WantedBy = indica a systemd quale target (pensa ai gruppi) di cui fa parte questo servizio. Ciò si traduce in collegamenti simbolici creati all’interno di quella destinazione per puntare al servizio.

In generale, questo è abbastanza per eseguire processi in background usando systemd in RHEL 7.

Altre opzioni per la logica di riavvio

Nell’esempio sopra, ho configurato Restart = on-abort ma questa non è l’unica opzione. Ci sono più e scegliere in base al requisito.

  • on-fallimento – verrà riavviato quando codice di uscita o segnale non pulito
  • sempre – riavviare quando viene rilevato un segnale pulito, non pulito
  • on-anormale – segnale sporco, watchdog o timeout
  • on-successo – solo quando è stato arrestato da un segnale pulito o da un codice di uscita

Configurazione del servizio per l’avvio all’avvio

Una volta che sei soddisfatto dello script e assicurati che funzioni, successivamente vuoi configurarlo in modo che si attivi all’avvio e all’avvio.

Vai su / etc / systemd / system ed esegui di seguito il comando di abilitazione (non dimenticare di cambiare il nome del file .service con quello che hai)

# systemctl abilita chat_server.service

Vedrai una conferma che ha creato un collegamento simbolico.

Link simbolico creato da /etc/systemd/system/multi-user.target.wants/chat_server.service a /etc/systemd/system/chat_server.service.

Riavvia il server e dovresti vedere l’avvio del servizio all’avvio.

È stato facile! No?

Aiuto! Sono massicciamente investito in Upstart. ��

Capisco che ti fidi di me, il tuo caso è la norma piuttosto che l’eccezione. RHEL utilizza Upstart da così tanto tempo che l’interruttore sembra quasi un tradimento. Ma hey, i sistemi continuano a cambiare e non dovremmo litigare per le sciocchezze. Red Hat riconosce che molte persone sono bloccate con versioni precedenti e hanno creato un guida alla migrazione a cui dovresti assolutamente fare riferimento.

Un vantaggio salvifico in tutto ciò è che systemd è compatibile con gli script di init SysV, quindi per la maggior parte, dovrai semplicemente spostare i tuoi file e ottenere gli stessi servizi in esecuzione.

Ti interessa saperne di più sull’amministrazione e la risoluzione dei problemi di Linux? Controlla questo corso online.

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map