web-dev-qa-db-ja.com

systemctlとserviceコマンドの違い

systemdは、ブート時にサービスを開始できるようにするために主に使用されるsystemctlコマンドスイートを提供します。 systemctlを使用して、サービスの開始、停止、リロード、再起動、およびステータスの確認もできます。

たとえば、Sudo systemctl enable service_nameを実行でき、service_nameはブート時に自動的に開始されます。ブート時に起動しないサービスを無効にすることもできます。

servicesystemctlコマンドの違いは、実行時にサービスの開始を有効にするためにsystemctlを使用できることだけですか?どのサービスでもsystemctlを使用できますか?他に重要な違いは何ですか?

136
luv.preet

serviceコマンドは、システム管理者が実際に使用されているinitシステムをあまり心配することなく、サービスの開始、停止、およびステータスの確認を行うことができるラッパースクリプトです。 systemdの導入前は、/etc/init.dスクリプトとUpstartのinitctlコマンドのラッパーでしたが、現在はこれら2つのandsystemctlのラッパーでもあります。

ソースを使用、ルーク!

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スクリプトをクリーンな環境で実行します。 (上記のrun_via_sysvinit関数のlongenvコマンド呼び出しに注意してください。)
  • Upstartシステム上のrestartstop/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コマンドは起動時にサービスの有効化または無効化に関与しませんでした。

138
muru
  • 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 [email protected] list-units

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

32
Ravexina