Esiste un modo standard per avviare e arrestare i servizi su Linux?


15

Fino a poco tempo fa c'era un modo semplice ed efficace per avviare / arrestare / riavviare i servizi:

service nginx start|stop|restart

Questo ha funzionato perfettamente per così tanti anni, ... fino a quando alcuni smart-pants hanno deciso di migliorarli e ora sto affrontando sistemi Debian / Ubuntu in cui lo servicescript non fa nulla (come dovrei usare le cose come systemctl start nginx.service(molto più a lungo, nessuna funzione di completamento automatico, ...)

La mia domanda si riferisce in particolare a Debian e Ubuntu ma sarebbe utile anche coprire le distro CentOS / RedHat.

Quindi, c'è qualcosa che può salvarmi da questi cambiamenti condannati?

Nel caso in cui non fosse chiaro, sto cercando un modo coerente per gestirli, uno che funzionerebbe su Debian 7.x, 8.x, l'ultima versione di Ubuntu LTS e non LTS.

PS. Al di fuori dell'ambito di questa domanda specifica, ma ulteriori riconoscimenti concessi se la soluzione coprirebbe anche la parte di abilitazione e disabilitazione per i servizi.


5
Il completamento delle schede funziona per systemctl per me ... E, piaccia o no, systemd è lo standard di fatto ora: può anche abituarsi.
Jasonwryan,

1
Extra: se il comando di servizio diventa inutile, posso rimuoverlo? Quale pacchetto lo fornisce?
sorin,

3
Non ha senso sostituire il vecchio servicecomando con un wrapper che chiama invece servicectl?
sorin,

4
@jasonwryan Sì, ma si può anche fare proprio questo , e un involucro in grado di gestire, rendendo più agevole la transizione verso systemd per gli utenti.
Dmitry Grigoryev,

2
Non fa servicedavvero niente per te? Funziona come previsto sul mio LMDE (che è fondamentalmente un test Debian), non pensavo fosse una cosa specifica per LMDE. Funziona anche come previsto nella mia macchina virtuale Ubuntu.
terdon

Risposte:


6

Ci sono stati diversi sistemi di controllo di avvio e servizi su piattaforme Unix nel corso della sua storia intricata.

Il service\chkconfigsistema basato che hai trovato semplice ed efficace è generalmente indicato come stile SysVinit ed è stato un grande passo avanti verso una sorta di standardizzazione. Troverai questo stile di avvio su RHEL / CentOS (EL) fino alla versione 6, Fedora fino a 14 e su distribuzioni basate su Debian / Ubuntu fino al 2015. Non è stato l'unico sistema di avvio in circolazione, lo stile (più semplice) di BSD Il sistema init ha ancora molti fan.

SysVinit non era una soluzione perfetta (cos'è?) E Systemd è stato ideato per superare molti dei problemi; questo è il systemctlsistema basato sui comandi che stai sperimentando. Sebbene non sia universalmente apprezzato (le persone odiano il cambiamento, il gonfiore, ecc.), Non c'è dubbio che sta rapidamente diventando lo standard defacto nella maggior parte delle distribuzioni.

Pertanto, guardare subito avanti la risposta alla tua domanda originale è semplicemente:
il modo standard per controllare i servizi nella maggior parte delle distribuzioni Linux è ora systemctl!
Per quanto tempo ciò sarà vero è l'ipotesi di chiunque; probabilmente solo fino a quando succederà qualcosa che è meglio e viene ampiamente adottato.

Sono sicuro che ci saranno involucri disponibili per consentire, il tuo preferito preferito, i service/chkconfigcomandi per continuare a fare cose per lo più sane, ma con questa particolare curva di apprendimento è probabilmente meglio non combatterla. Forse non vedo l'ora, per un po 'ci saranno anche systemctlinvolucri per i sistemi più vecchi, per rendere meno facile la loro gestione insieme a quelli più attuali;)


E prima era xinetd, e prima era inetd
jas

@ jas- Penso che gli inetd siano dei servizi stessi, credo che possano esistere all'interno di tutti i sistemi di avvio. Sono un tipo speciale di servizio in quanto forniscono un'alternativa per alcuni altri servizi all'esecuzione come servizi completi, fornendo invece su richiesta . Capisco da dove vieni nel contesto di questa Q, solo un altro modo per avviare i servizi.
DanSut

In tutte le distribuzioni; gentoo, centos, redhat, debian, ubuntu ecc., xinetd e precedentemente inetd consistevano in piccoli script di shell per avviare, arrestare e ricaricare le configurazioni per vari servizi, ma sì, hai ragione, erano davvero un servizio proprio come lo è systemd.
jas

Ubuntu ha usato upstart dal 6.10 e Fedora dal 9 (fino a quando non sono stati sostituiti da systemd) upstart.ubuntu.com , ed è stato possibile spostare Debian lontano da sysvinit per alcuni anni ...
James Tocknell

5

Non ha senso sostituire il vecchio servicecomando con un wrapper che chiama invece servicectl[sic]?

Sì, ma [...] un wrapper potrebbe gestirlo, rendendo la transizione a systemd più agevole per gli utenti.

... che è, come altri hanno detto nei commenti, ciò che è stato fatto da molto tempo .

Il /usr/sbin/servicecomando su Debian 8 fa parte del pacchetto sysvinit-utils. È lì dal 2009. È un'aggiunta di RedHat specifica per Debian al pacchetto sorgente originale sysvinit e, come si può vedere dalla lettura dello script, riconosce sia l'esecuzione del sistema che la presenza di lavori di avvio, dando comandi systemctle initctl( tramite i suoi alias) rispettivamente. Lo ha fatto dal 2013.

service name actionè abbastanza ampiamente disponibile anche su sistemi operativi non Linux. Funzionerà anche sulla maggior parte dei BSD, poiché anche loro hanno i loro servicecomandi. C'è anche un servicecomando shim nel pacchetto nosh che si traduce in . Ma …system-control action name

  • ... vai oltre questo sottoinsieme comune e c'è molta meno compatibilità ovunque.
  • ... OpenBSD non ha alcun servicecomando.
  • ... i servicecomandi BSD hanno noti problemi di lunga data di cui gli amministratori di sistema raccontano storie di guerra da decenni.

Abilitare e disabilitare i servizi è una situazione simile. Sebbene il chkconfigprogramma SuSE (disponibile in pacchetto per Debian e Ubuntu) sia molto diverso da quello di Fedora (essendo scritti in linguaggi di programmazione completamente diversi, anche - uno compilato, uno interpretato), esiste una sintassi minima comune , con azione in corso o . Ma …chkconfig name actiononoff

  • ... ancora una volta, oltre questo sottoinsieme comune c'è meno compatibilità.
  • ... Non c'è chkconfigsui BSD, poiché gli strumenti convenzionali per questo sono uno sysrco il più recente OpenBSD rcctl enablee rcctl disable. Ci sono chkconfige rcctlspessori nel pacchetto nosh che si traducono in e .system-control enable namesystem-control disable name
  • ... solo la Fedora chkconfigconosce systemd e funge da shim per systemctl enablee systemctl disable. Il SuSE chkconfignon ha alcuna conoscenza di systemd.

Ulteriori letture


2

Non esiste un modo standard per avviare e arrestare i servizi su Linux.

c'è qualcosa che può salvarmi da questi cambiamenti condannati?

Prova lo strumento di gestione / orchestrazione della configurazione: Ansible , Chef , Saltstack , Puppet o altro.

Puoi avviare e abilitare un servizio con Ansible:

ansible all -i inv -m service -a 'name=service-name state=started enabled=true'

Dai un'occhiata alla classe LinuxService nel servicemodulo Ansible :

Questa è la classe di manipolazione del servizio Linux: attualmente supporta una combinazione di binari e script di inizializzazione per il controllo dei servizi avviati all'avvio, nonché per il controllo dello stato corrente.


In qualche modo sembra che i ragazzi di Ubuntu siano stati in grado di mantenere lo script di servizio funzionante dopo essere passati a systemd. Guardare dentro sembra essere abbastanza intelligente da usare il giusto backend. Non posso dire lo stesso di Debian.
sorin,



1

Il tuo problema è che Debian / Ubuntu sono passati al nuovo systemdin sostituzione del vecchio sysvinit. Chiedi quale è meglio e inizierai una guerra di fiamma, ma puoi sempre tornare al vecchio sysvinit, controlla questo se vuoi tornare indietro.

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.