web-dev-qa-db-ja.com

Linuxサーバーを停止するためのこれらのコマンドの違いは何ですか?

"HaltコマンドとShutdownコマンドの違いは何ですか?" を読んで、一般に、-h/-rオプションの有無にかかわらず、コマンドshutdownが何を行うかを理解しています。

「halt」コマンドは、システムの電源オフを実行して、システムの実行レベル0にします。

「shutdown」コマンドは、-hまたは-rコマンドを使用せずにシステムの電源オフを実行レベル1に実行します。

コマンド「poweroff」は、実行レベル0または1になりますか?これがこれら3つのコマンドの唯一の主な違いですか?

69
Win.T

そして今、systemdの答え。

質問のタグごとに、Red Hat Enterprise Linuxを使用しています。バージョン7以降、systemdを使用しています。他の答えはどれもsystemdの世界では正しくありません。また、質問の前提条件の一部でもありません。

  • ランレベルを忘れる ;それらは存在しますが、互換性シムとしてのみ存在します。 systemdのドキュメントには、この概念は「時代遅れ」であると記載されています。 systemdオペレーティングシステムでこのことを学び始めている場合は、そこから始めないでください。
  • Marcelmが引用したマニュアルページを忘れてください。これは、適切なツールセットからのものではなく、systemdに対して正しくない別のツールセットのコマンドの説明です。これは、van Smoorenburg "System 5" haltユーティリティからのinitコマンド用です。
  • /sbin/halt/sbin/rebootへのシンボリックリンクであるというステートメントは無視してください。これはsystemdでは当てはまりません。個別のrebootプログラムはまったくありません。
  • haltまたはrebootがコマンドライン引数を使用してshutdownプログラムを呼び出すステートメントは無視してください。また、systemdでは正しくありません。個別のshutdownプログラムはまったくありません。

すべてのシステム管理ツールセットには、これらのユーティリティのバージョンがあります。 systemd、upstart、 nosh 、van Smoorenburg init、およびBSD initには、それぞれ独自のhaltpoweroffなどがあります。前方へ。それぞれのメカニズムは少し異なります。マニュアルページも同様です。

Systemdツールセット haltpoweroffreboottelinitshutdown は、all/bin/systemctlへのシンボリックリンクです。これらはall下位互換性シムであり、systemdの主要なコマンドラインインターフェースsystemctlを呼び出すための単なる省略形です。それらはすべて、同じsingleプログラムにマップされます(実際にはそうです)。 (慣例により、シェルは呼び出された名前をシェルに通知します。)

ランレベルではなくターゲット

これらのコマンドのほとんどは、systemctlを使用して特定のtargetisolateするようにsystemdに指示するための省略形です。分離はsystemctlのマニュアルページ(q.v.)で説明されていますが、この回答では、ターゲットを開始し、他のターゲットを停止すると考えることもできます。 systemdで使用される標準ターゲットは、systemd.special(8)マニュアルページにリストされています。

Systemdツールセットのbootup(7)マニュアルページの図、特に最後の図は、ここに関連する3つの「最終的な」ターゲットがあることを示しています。

  • halt.target —システムがこのターゲットを完全に分離する状態に達すると、reboot(RB_HALT_SYSTEM)システムコールが呼び出されます。カーネルは、ROM監視プログラムに入るのを試みるか、単にCPUを停止しました(適切なメカニズムを使用して)。
  • reboot.target —システムがこのターゲットを完全に分離する状態に到達すると、reboot(RB_AUTOBOOT)システムコール(または同等の魔法のコマンドライン)が呼び出されます。カーネルは再起動をトリガーしようとしました。
  • poweroff.target —システムがこのターゲットを完全に分離する状態に達すると、reboot(RB_POWER_OFF)システムコールが呼び出されます。カーネルは、可能であれば、システムの電源を切断しようとしました。

これらは、実行レベルではなく、最終的なシステムの状態として考慮する必要があることです。図から、systemdターゲットシステム自体が、他のシステムでは明示的ではなく暗黙的であるものをエンコードしていることに注意してください。たとえば、これらの最終ターゲットのそれぞれがshutdown.targetターゲットを包含しているため、シャットダウン前に停止する必要のあるサービスを記述できるshutdown.targetターゲットとconflictすることで.

systemctlは、呼び出し元のユーザーがスーパーユーザーでない場合に、リクエストを systemd-logind に送信しようとします。また、遅延シャットダウンを systemd-shutdownd に渡します。そして、いくつかの省略形はwall通知をトリガーします。これらの複雑さはさておき、あなたが現在スーパーユーザーであり、スケジュールされたアクションを要求していないと仮定すると、この答えは数倍長くなります:

  • systemctl isolate halt.targetには省略形があります:
    • shutdown -H now
    • systemctl halt
    • 素朴で飾り気のないhalt
  • systemctl isolate reboot.targetには省略形があります:
    • shutdown -r now
    • telinit 6
    • systemctl reboot
    • 素朴で飾り気のないreboot
  • systemctl isolate poweroff.targetには省略形があります:
    • shutdown -P now
    • telinit 0
    • shutdown now
    • systemctl poweroff
    • 素朴で飾り気のないpoweroff
  • systemctl isolate rescue.targetには省略形があります:
    • telinit 1
    • systemctl rescue
  • systemctl isolate multi-user.targetには省略形があります:
    • telinit 2
    • telinit 3
    • telinit 4
  • systemctl isolate graphical.targetの略記:
    • telinit 5

さまざまな異なるコマンドライン構文を解析した後、これらすべては最終的にsystemctlプログラム内の同じコードパスになります。

ノート:

  • オプションのないshutdown nowの従来の動作は、シングルユーザーモードに切り替えることでした。これはsystemdには当てはまりません。 rescue.target — systemdで名前が変更されているシングルユーザーモードレスキューモードshutdownコマンドで到達できません。
  • telinitは、マニュアルページで説明されているファイルシステム内のrunlevelN.targetおよびdefault.targetシンボリックリンクのすべてを完全に無視します。前述のマッピングは、テーブル内のsystemctlプログラムに組み込まれています。
  • systemdには、現在の実行レベルという概念はありません。これらのコマンドの操作は、「実行レベル[〜#〜] n [〜#〜]の場合」を条件とするものではありません。
  • haltreboot、およびpoweroffコマンドの--forceオプションは、--force --forcesystemctl halt、およびsystemctl rebootコマンドにsystemctl poweroffを指定するのと同じです。これにより、systemctlreboot()を直接呼び出そうとします。通常、ターゲットを分離しようとします。
  • telinitinitと同じではありません。これらはsystemdの世界では異なるプログラムであり、後者はsystemdプログラムではなくsystemctlプログラムの別名です。 systemdプログラムは、必ずしもファンスモーレンブルクの互換性を備えてコンパイルされているとは限りません。また、一部のsystemdオペレーティングシステムでは、init Nを実行しようとすると、誤って呼び出されるという不満があります。

参考文献

128
JdeBP
  • halt ハードウェアに すべてのCPU機能を停止する を指示しますが、電源が入った状態のままにします。これは通常、後で電源ボタンを押して手動でマシンを再起動またはシャットダウンする必要があることを意味します。これを実現する特定の方法はアーキテクチャ固有ですが、たとえばx86命令セットは、次の外部割り込みが発生するまで中央処理装置(CPU)を停止する HLT 命令を提供します。

  • poweroff は、haltと同様に、CPUを停止しますが、 [〜#〜] acpi [〜#〜] ハードウェア信号も送信します。完全な即時シャットダウンを開始するようにシステムに指示します。これは、一般的なデスクトップコンピュータの電源ボタンを押すのとほぼ同じです。

haltpoweroffは通常、reboot実行可能ファイルへのシンボリックリンクであり、通常は適切な shutdown ツールを呼び出しますツールの呼び出しにrhaltまたはpoweroffが使用されたかどうかに応じて、引数(_-h_、_-P_またはreboot) 。ただし、_--force_オプションがrebootに渡される場合、またはランレベル0または6の場合、rebootreboot() を呼び出します=適切なコマンドコード自体を使用したシステムコール。

25
Thomas Nyman

haltpoweroffおよびshutdown -hは完全に同等です。実際、haltとpoweroffはshutdown -hを呼び出すだけです。 halt/poweroffマンページから:

システムがランレベル0または6ではないときに停止または再起動が呼び出された場合、つまり、システムが正常に実行されている場合、代わりにシャットダウンが呼び出されます(-hまたは-rフラグを使用)。詳細については、shutdown(8)のマンページを参照してください。

シャットダウンは、ランレベル0に切り替えてシステムをシャットダウンします。

停止と電源オフ(および再起動)は2つの役割を果たします。シャットダウンのプロセスで実行されると(つまり、ランレベル0または6)、別の回答で説明されているように、マシンを物理的に停止、電源オフ、または再起動するために必要な低レベルの操作を実行します。

1
marcelm