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


65

読んで「停止およびシャットダウンコマンドの違いは何ですか?」、-h / -rオプションの有無にかかわらず、コマンドshutdownが何をするのか、一般的に考えています。

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

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

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



これは、SolarisとFreeBSDなどで大きく異なる点の一部です。(そこでは、通常(ほぼ)すぐにサーバーを停止/シャットダウンします。ランレベルを変更して最初にシャットダウンすることはありません)
ゲルトファンデンバーグ

回答:


120

そして今、systemdの答え。

質問のタグごとに、Red Hat Enterprise Linuxを使用しています。バージョン7以降、systemdを使用しています。systemdの世界にとって、他の答えはどれも正しくありません。また、あなたの質問にある仮定のいくつかもありません。

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

すべてのシステム管理ツールセットには、これらのユーティリティのバージョンがあります。systemdに、成り上がり、間食、バンSmoorenburg init、およびBSD initすべては自分のを持っているhaltpoweroffなどと。それぞれのメカニズムはわずかに異なります。マニュアルページも同様です。

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

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

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

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

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

これらは、実行レベルではなく、最終的なシステム状態として考える必要があるものです。そのようなこれらの最終目標のそれぞれが含まれるという考えのように:にsystemdターゲット・システム自体は、他のシステムでは、あるもの、暗黙的ではなく、明示的な符号化の図からのお知らせshutdown.targetその1がでシャットダウン前に停止しなければならないサービスについて説明しますので、ターゲットをそれらがターゲットと競合するようにshutdown.targetます。

systemctlsystemd-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.targetdefault.targetsystemctl
  • systemdには、現在の実行レベルの概念はありません。これらのコマンドの操作は、「実行レベルNの場合」を条件としません。
  • --forceオプションhaltrebootおよびpoweroffコマンドが言うように同じである--force --forcesystemctl haltsystemctl rebootsystemctl poweroff命令。これにより、直接systemctl呼び出しを試みますreboot()。通常、ターゲットを隔離しようとします。
  • telinitはと同じではありませんinit。システム化された世界では異なるプログラムであり、後者はsystemdプログラムではなくプログラムの別名systemctlです。systemdプログラムは、必ずしもすべての任意のバンSmoorenburgの互換性、およびいくつかにsystemdのオペレーティングシステム上でコンパイルされていない1段のしようとした場合、誤って呼び出されて文句を言います。init N

参考文献


1
これは、ほとんどの最新のLinuxシステムで非常に一般的であるため、たとえばwiert.me/2012/12/30/…と答えています。
Jeroen Wiert Pluimers 16

systemctl rebootに相当する必要がありますsystemctl start reboot.target --job-mode=replace-irreversible。他のジョブモードを使用すると、堅牢性が低下します。 unix.stackexchange.com/questions/381739/…– sourcejedi
14:47

1
私はあなたの全返事を読み、私ができることを吸収しました。私がここに来たのと同じ質問が残っていますが、それはsystemctl reboot「安全な」再起動init 6方法です。
ブライアントーマス

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

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

両方haltとはpoweroff通常へのシンボリックリンクであるreboot通常起動する実行可能な、shutdown適切な引数(とツール-h-Pまたはr場合に応じて)haltpoweroffまたはrebootツールを起動するために使用しました。ただし、--forceオプションがに渡されるrebootとき、またはランレベル0または6のときは、適切なコマンドコード自体でシステムコールをreboot呼び出しreboot()ます。


トーマス、説明してくれてありがとう。#init 0の実行について知りたいのですが、違いはあまりありませんか?
Win.T

@ Win.Tは0使用例をランレベルに切り替え/sbin/init 0たり/sbin/telinit 0取ら特定のステップのような、問題のinitシステムに依存するものの、システムを停止すると同じにする必要があり、システム-Vの初期化成り上がりにsystemd。RHELを実行している場合、systemdを使用します。
トーマスナイマン

4
自己への注意:誰かが不可解なWin32 API呼び出しについて不平を言うたびに、彼らにreboot(2)を見せてください。
user253751

@immibisしかし、再起動は意図的に難解です。マジックフラグが必要なので、偶然に行うのは非常に困難です。
ケビンコックス

4
@KevinCoxこれは、マジックフラグを要求するための引数です。magic2の4つの異なる値を受け入れたり、PID名前空間内で異なる動作をしたり、ほとんど関係のない操作(reboot-on-Ctrl-Alt-Delete動作の設定など)を1つの関数にまとめたりするための引数ではありません。
user253751

1

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

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

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

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


2
どのバージョンのRHELを使用していますか?通常、haltとpoweroffには違いがあります(しばらくの間、多くのディストリビューションではそうではありませんでしたが、それはバグでした)。
ブルーノ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.