Vraag Verschil tussen Systemctl en Service


systemd geeft ons de systemctl commando dat meestal wordt gebruikt om services in te schakelen bij het opstarten. We kunnen ook starten, stoppen, opnieuw laden, herstarten en de status van services controleren met behulp van systemctl.

We kunnen doen sudo systemctl enable service_name, en de service start automatisch bij het opstarten. We kunnen ook services uitschakelen die niet tijdens het booten starten.

Is het enige verschil tussen de service en systemctl commando's dat systemctl services tijdens runtime kan starten? Kunnen we gebruiken systemctl op een dienst? Welke andere significante verschillen zijn er?


79
2018-04-10 21:35


oorsprong


Ik denk dat jij zelf het verkeerde antwoord hebt gekozen. - Evan Carroll


antwoorden:


De service command is een wrapper-script waarmee systeembeheerders de status van services kunnen starten, stoppen en controleren, zonder zich teveel zorgen te maken over het daadwerkelijke init-systeem dat wordt gebruikt. Voor de invoering van systemd was het een omslag voor /etc/init.d scripts en Upstart's initctl commando, en nu is het een verpakking voor deze twee en  systemctl ook.

Gebruik de bron, Luke!

Het controleert op Upstart:

# Operate against system upstart, not session
unset UPSTART_SESSION
if [ -r "/etc/init/${SERVICE}.conf" ] && which initctl >/dev/null \
   && initctl version 2>/dev/null | grep -q upstart \
   && initctl status ${SERVICE} 2>/dev/null 1>/dev/null
then
   # Upstart configuration exists for this job and we're running on upstart

Als dat niet werkt, zoekt het systemd:

if [ -d /run/systemd/system ]; then
   is_systemd=1
fi

...

# When this machine is running systemd, standard service calls are turned into
# systemctl calls.
if [ -n "$is_systemd" ]
then

En als dat ook mislukt, valt het terug naar systeem V. /etc/init.d scripts:

run_via_sysvinit() {
   # Otherwise, use the traditional sysvinit
   if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
      exec env -i LANG="$LANG" LANGUAGE="$LANGUAGE" LC_CTYPE="$LC_CTYPE" LC_NUMERIC="$LC_NUMERIC" LC_TIME="$LC_TIME" LC_COLLATE="$LC_COLLATE" LC_MONETARY="$LC_MONETARY" LC_MESSAGES="$LC_MESSAGES" LC_PAPER="$LC_PAPER" LC_NAME="$LC_NAME" LC_ADDRESS="$LC_ADDRESS" LC_TELEPHONE="$LC_TELEPHONE" LC_MEASUREMENT="$LC_MEASUREMENT" LC_IDENTIFICATION="$LC_IDENTIFICATION" LC_ALL="$LC_ALL" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" ${ACTION} ${OPTIONS}
   else
      echo "${SERVICE}: unrecognized service" >&2
      exit 1
   fi
}

...
run_via_sysvinit

Sinds de service opdracht is een vrij eenvoudige omslag, het ondersteunt slechts een beperkte subset van acties in vergelijking met wat het daadwerkelijke init-systeem zou kunnen bieden.

Voor draagbaarheid via verschillende versies van Ubuntu kunnen gebruikers de service commando om de status van een service te starten, stoppen, herstarten of onderzoeken. Voor meer complexe taken, echter, is het daadwerkelijke commando dat wordt gebruikt, dat initctl of systemctl of de /etc/init.d script moet misschien direct worden gebruikt.

Verder, als een wikkel, de service script doet in sommige gevallen ook meer dan het directe equivalente commando zou kunnen doen. Bijvoorbeeld:

  • Het wordt altijd uitgevoerd /etc/init.d scripts in een schone omgeving. (Merk op lang  env opdracht aanroep in de run_via_sysvinit functie hierboven.)
  • Het kaarten restart op Upstart-systemen naar een combinatie van stop/start, sinds een vlakte initctl restart foutmelding als de service niet al actief is.
  • Het stopt sockets bij het stoppen van systemd services die bijbehorende sockets hebben:

    case "${ACTION}" in
      restart|status)
         exec systemctl $sctl_args ${ACTION} ${UNIT}
      ;;
      start|stop)
         # Follow the principle of least surprise for SysV people:
         # When running "service foo stop" and foo happens to be a service that
         # has one or more .socket files, we also stop the .socket units.
         # Users who need more control will use systemctl directly.
    

Upstart-services werden direct ingeschakeld in het serviceconfiguratiebestand (of uitgeschakeld via overschrijvingen), en System V-scripts werden ingeschakeld of uitgeschakeld met de update-rc.d commando (die symlinks beheerde in de /etc/rc* mappen), dus de service commando was nooit betrokken bij het in- of uitschakelen van services tijdens het booten.


72
2018-04-11 03:03



uitstekende uitleg, bedankt. - Willa O Ng'wana


  • systemd is achterwaarts compatibel met SysV.
  • laadt services parallel bij het opstarten
  • het biedt on-demand activering van een dienst
  • het is afhankelijk van de afhankelijkheid
  • en nog veel meer denk ik ...

Er zijn veel meer dan wat je noemde systemctl is in staat om.

systemd werkt met eenheden, er zijn verschillende soorten eenheden: doelen, services, sockets, etc. doelen zijn hetzelfde concept als runlevels, het zijn een aantal eenheden samen.

Je kunt gebruiken systemctlom het standaardsysteemdoel in te stellen of te verkrijgen.

systemctl get-default

Je kunt andere doelen stellen:

systemctl isolate multiuser.target

Andere doelen zijn: multi-user, grafisch, recue, emergency, reboot, poweroff.

Zoals je al zei, kun je gebruiken systemctl om services te beheren, zijn enkele van de andere opdrachten met betrekking tot servicebeheer die ik ken, de volgende:

# Restarts a service only if it is running.
systemctl try-restart name.service

# Reloads configuration if it's possible.
systemctl reload name.service

# try to reload but if it's not possible restarts the service
systemctl reload-or-restart name.service

U kunt het gebruiken om meer te weten te komen over een servicestatus:

systemctl status name.service

systemctl is-active name.service # running
systemctl is-enabled name.service # will be activated when booting
systemctl is-failed name.service # failed to load

U kunt een service maskeren of ontmaskeren:

systemctl mask name.service
systemctl unmask name.service

Wenst u een dienst te maskeren waaraan deze zal worden gekoppeld /dev/null, dus handmatig of automatisch kunnen andere services het niet activeren / activeren. (je zou het eerst moeten ontmaskeren).

Een ander gebruik van systemctl is om eenheden op te sommen:

systemctl list-units

Welke lijst alle soorten eenheden bevat, geladen en actief.

Lijst service-eenheden:

systemctl list-units --type=service

Of om alle beschikbare eenheden weer te geven die niet alleen zijn geladen en geactiveerd:

systemctl list-unit-files

U kunt aliassen maken of zelfs externe machines besturen

systemctl --host ravexina@192.168.56.4 list-units

Aan de ándere kant service doet wat het moet doen, diensten beheren en niets te maken hebben met zaken van andere mensen;)


21
2018-04-10 21:53



dat was een perfect antwoord, is er iets dat service kan doen maar niet systemctl ? - luv.preet
Niets waarvan ik me bewust ben, ik denk dat ik ernaar kijk serviceman pagina zou nuttig zijn. - Ravexina
Er zijn enkele voor de hand liggende verschillen. Syntaxis is er één. Een andere is dat systemv-scripts nooit met sockets zijn behandeld, voor zover ik weet. Het feit dat systemd probeert om te gaan met netwerkachtige zaken is een andere, en het is een frequent punt van kritiek. Al met al probeert systemd meer te doen dan alleen maar services starten - Sergiy Kolodyazhnyy
Ik zou hier een klacht willen indienen over het systematisch verbergen van logboekberichten van mislukt service start pogingen. Pre-systemd, service start zou ik meteen laten zien waarom mijn dienst niet zou starten. Na het systeem, moet ik vier of vijf verschillende logboeken bekijken voordat ik het kan vinden. Dat gezegd hebbende, mijn opmerking staat ongetwijfeld buiten het onderwerp en zal waarschijnlijk worden verwijderd. - Ross Presser
AFAICS Dit antwoord lijkt niets te zeggen over de service bevel, was dat niet een deel van de vraag? - ilkkachu