systemd
は、ブート時にサービスを開始できるようにするために主に使用されるsystemctl
コマンドスイートを提供します。 systemctl
を使用して、サービスの開始、停止、リロード、再起動、およびステータスの確認もできます。
たとえば、Sudo systemctl enable service_name
を実行でき、service_name
はブート時に自動的に開始されます。ブート時に起動しないサービスを無効にすることもできます。
service
とsystemctl
コマンドの違いは、実行時にサービスの開始を有効にするためにsystemctl
を使用できることだけですか?どのサービスでもsystemctl
を使用できますか?他に重要な違いは何ですか?
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
コマンド呼び出しに注意してください。)restart
を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
コマンドは起動時にサービスの有効化または無効化に関与しませんでした。
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
は、サービスを管理し、他の人々のビジネスとは何の関係もない、やらなければならないことを行います;)