systemctlとserviceコマンドの違い


143

systemd私たちに与えsystemctl、主にブート時に起動するサービスを有効にするために使用されるコマンド・スイートを。また、を使用して、サービスの開始、停止、再読み込み、再起動、およびステータスの確認もできますsystemctl

私たちは、例えば、行うことができsudo systemctl enable service_name、およびservice_name起動時に自動的に起動します。ブート時に起動しないサービスを無効にすることもできます。

実行時にサービスの開始を有効にするために使用できるservicesystemctlコマンドの唯一の違いはありますsystemctlか?systemctl任意のサービスで使用できますか?他に重要な違いは何ですか?


あなたは間違った答えを自分で選んだと思います。
エヴァンキャロル

回答:


144

このserviceコマンドは、システム管理者が実際に使用されているinitシステムについてあまり心配することなく、サービスの開始、停止、およびステータスの確認を行うことができるラッパースクリプトです。systemdにの導入に先立ち、それはラッパーだった/etc/init.dスクリプトと成り上がりのinitctlコマンド、そして今では、これら二つのラッパーである systemctl同様。

ソース、ルークを使用してください!

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

それが機能しない場合、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

それに失敗した場合も、System V /etc/init.dスクリプトにフォールバックします。

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

このserviceコマンドは非常に単純なラッパーであるため、実際のinitシステムが提供するものと比較して、限られたアクションのサブセットのみをサポートします。

Ubuntuのさまざまなバージョンでの移植性のために、ユーザーはserviceコマンドを確実に使用して、サービスの開始、停止、再起動、または状態の確認を行うことができます。より複雑なタスクのために、しかし、実際のコマンドが使用されて、それであるinitctlか、systemctlまたは/etc/init.dスクリプトを直接使用することが必要になる場合があります。

さらに、ラッパーであるserviceスクリプトは、場合によっては直接同等のコマンドが行うよりも多くのことを行います。例えば:

  • 常に/etc/init.dクリーンな環境でスクリプトを実行します。(上記の関数での長い envコマンド呼び出しに注意してくださいrun_via_sysvinit。)
  • restartUpstartシステムではstop/の組み合わせにマッピングされます。サービスがまだ実行されていない場合はstartプレーンinitctl restartがエラーになるためです。
  • ソケットが関連付けられているsystemdサービスを停止すると、ソケットが停止します。

    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サービスはサービス構成ファイルで直接有効になり(またはオーバーライドにより無効になり)、System Vスクリプトはupdate-rc.dコマンド(/etc/rc*ディレクトリ内のシンボリックリンクを管理する)serviceで有効または無効になるため、コマンドは起動時にサービスの有効化または無効化に関与しませんでした。


34
  • systemdはSysVと下位互換性があります。
  • 起動時にサービスを並行してロードします
  • サービスのオンデマンドアクティベーションを提供します
  • 依存関係に基づいています
  • そして、もっともっと...

あなたが言及した以上のsystemctl能力があります。

systemd ユニットで動作し、異なるタイプのユニットがあります。ターゲット、サービス、ソケットなど。ターゲットはランレベルと同じ概念で、ユニットの集まりです。

systemctlデフォルトのシステムターゲットを設定または取得するために使用できます。

systemctl get-default

他のターゲットに移動できます:

systemctl isolate multiuser.target

その他のターゲットは、マルチユーザー、グラフィカル、リキュー、緊急、再起動、電源オフです。

あなたが言ったように、あなたはsystemctlサービスを管理するために使うことができます、私が知っているサービス管理に関連する他のコマンドのいくつかは:

# 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

これを使用して、サービスステータスについて調べることができます。

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

サービスをマスクまたはマスク解除できます。

systemctl mask name.service
systemctl unmask name.service

リンクされるサービスをマスクすると/dev/null、手動または自動で他のサービスがアクティブ化/有効化できなくなります。(最初にマスクを解除する必要があります)。

systemctlのもう1つの使用法は、ユニットをリストすることです。

systemctl list-units

ロード済みおよびアクティブなすべての種類のユニットをリストします。

サービスユニットのリスト:

systemctl list-units --type=service

または、ロードおよびアクティブ化されたユニットだけでなく、使用可能なすべてのユニットをリストするには:

systemctl list-unit-files

エイリアスを作成したり、リモートマシンを制御することもできます

systemctl --host ravexina@192.168.56.4 list-units

一方service、サービスを管理し、他の人々のビジネスとは何の関係もない、やらなければならないことを行います;)


1
それは完璧な答えでしたが、serviceできることはありsystemctlますか?
luv.preet

私がそれを知っていることは何もありません。サービスのマニュアルページを見ると役立つと思います。
-Ravexina

1
いくつかの明らかな違いがあります。構文は1つです。もう1つは、私が知る限り、systemvスクリプトはソケットを処理しなかったことです。systemdがネットワークタイプのものを処理しようとしているという事実は別のものであり、それは頻繁に批判のポイントです。すべてにわたり、systemdには、始まったばかりのサービス以上のことをやろうとしている
Sergiy Kolodyazhnyy

ここで、失敗したservice start試行からログメッセージを非表示にするsystemdについて苦情を申し上げます。pre-systemdを使用service startすると、サービスが開始されない理由がすぐにわかります。systemd後、見つける前に4つまたは5つの異なるログを調べる必要があります。そうは言っても、私のコメントは間違いなく話題から外れており、おそらく削除されるでしょう。
ロスプレッサー

11
AFAICSこの回答は、serviceコマンドについて何も伝えていないようです。質問の一部ではありませんでしたか?
-ilkkachu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.