重要:実行すると、停止した古い動作を復元できます:
apt install sysvinit-core
Plus:古いRed Hatベースのバージョンも停止して電源を切ることができます。
Debian 9でhaltを使用してコンピューターの電源をオフにするべきではない理由を理解しようとしています。その動作はsystemdから削除されます。私は少し怖いですが、論理的な理由があるに違いないと思います。
他のUNIXまたはUnixライクはこれと同じ動作ですか、それともLinuxは別のものに変わりますか?
システムのシャットダウン後にマシンの電源をオフにする場合は、停止する代わりに電源オフを使用する必要があります...
このコマンドが他のUnixライクでどのように解釈されるか知っている人はいますか?
これは重複していません。たとえば、debian7は停止して電源を切ることができるからです。
Debian(esque)システムでSysVinitを使用する場合、/etc/defaults/halt
には、システムがランレベル0への移行の終わりに停止または電源切断を実行するかどうかを定義する変数が含まれます。デフォルト設定はHALT=poweroff
です。
SysVinit 2.74より前は、halt
を直接実行することは想定されていませんでした。そのバージョンから、現在のランレベルが0または6でない限り、SysVinit halt
コマンドはshutdown -h
を呼び出すだけです。これについては、halt(8)
のマニュアルページ。ランレベル0への移行が終了すると、ランレベルスクリプトは$HALT
を実行します。これは、デフォルトではpoweroff
と同じです。
RHEL/CentOS 5はSysVinitを使用する最後のバージョンでした:バージョン6はupstart
を使用し、バージョン7はsystemd
を使用しました。 RHEL 5.11では、ランレベル0に移行するときに実行される最後のスクリプトは/etc/init.d/halt
であり、その最後の行は次のとおりです。
[ "$INIT_HALT" != "HALT" ] && HALTARGS="$HALTARGS -p"
exec $command $HALTARGS
同じスクリプトがランレベル6(再起動)への移行の最後にも実行されるため、実行する実際のコマンドは変数$command
または/sbin/halt
または/sbin/reboot
のいずれかで定義されます。 $INIT_HALT
変数の値に従って、スクリプトは-p
オプションを追加するかどうかを決定します。その変数は/sbin/shutdown
によって設定されます。 RHEL 5.11 shutdown(8)
のマニュアルページには次のように書かれています。
HALT OR POWEROFF
-Hオプションはinit環境変数INIT_HALTをHALTに設定し、-Pオプションはその変数をPOWEROFFに設定するだけです。シャットダウンシーケンスの最後にhalt(8)を呼び出すシャットダウンスクリプトは、これらの環境変数をチェックし、これらのオプションが実際に効果を発揮するための適切なオプションを指定してhalt(8)を呼び出す必要があります。 Debian 3.1(sarge)はこれをサポートしています。
(はい、RHEL5.11のマニュアルページにはDebian3.1が記載されています!RedHatの誰かがさまざまなソースからRHELにパッチを移植していると思います...)
RedHatが上記のテストを/etc/init.d/halt
スクリプトでコーディングすることを決定したようです(シャットダウンの最後に/sbin/halt -p
を使用して)電源をオフにするのがデフォルトの停止アクションです:電源をオフにせずに停止する唯一の方法はshutdown
コマンドの大文字の-H
オプションを使用して明示的に要求するには、例えばshutdown -hH now
ただし、ここでも、デフォルトのパワーダウンはLinuxディストリビューションによってカスタマイズされたランレベルスクリプトによってトリガーされるため、SysVinit halt
コマンドの機能ではありません。
古いSysVinitを使用するシステム(Linuxと非Linuxの両方)には、直接使用するためではなく、適切なシャットダウン/再起動スクリプトの一部としてのみ使用するコマンドがいくつかありました。 SysVinit 2.74より前は、オプションのない/sbin/halt
コマンドは、最新のSysVinitのhalt -f
と同じように実行されていました。つまり、サービスを停止したりファイルシステムをアンマウントしたりすることなく、残忍な即時カーネルシャットダウンを実行していました。
同じ理由で、Linux killall
コマンドに慣れていると、他のUnixでは危険な場合があります。そのmanページにもこの不吉な警告があります:
Killall名を入力しても、Linux以外のシステムでは望ましい効果が得られない場合があることに注意してください(特に特権ユーザーが実行した場合)。
これは、従来のSystemV killall
が、シャットダウンスクリプトの一部としてのみ使用されるように設計されたコマンドの1つであったためです。 SysVinitを使用するLinuxディストリビューションでは、コマンドのクラシックバージョンはkillall5
として見つかる場合があります。カーネルスレッドとそれ自体のセッション内のプロセスを除くすべてのallプロセスを文字通り強制終了します。その使用目的は、すべてのサービスをシャットダウンした後、マウントを解除する直前のシャットダウンスクリプトです。ローカルファイルシステム。アンマウントを遅延または防止する可能性のある他のプロセスを強制終了します。
(私はこれをどのように知っていますか?そうですね、私はかつてSolaris 2.6システムでルートとしてkillall <something>
を実行するという間違いを犯しました。非常に効果的な学習体験です。)
halt
を使用してコンピューターの電源を切ることはありませんでした。これはsystemdで変更されていません。
halt
a.k.a .haltsys
はシャットダウンして停止します。 poweroff
は、シャットダウンして電源を切る新しいコマンドです。 ( https://unix.stackexchange.com/a/196471/5132 質問はLinuxオペレーティングシステムに関するものであるため、ここで説明する微妙な点について説明します。この回答は焦点を当てています。宇宙のAT&T System 5 UNIX側だけです。)
https://superuser.com/a/900205/38062 で説明したように、コンピュータは必ずしも電源を入れることができませんソフトウェア制御下でオフ。 haltsys
およびhalt
コマンドのアクションは、従来、マシンをシャットダウンして停止することでした。次のアクションは、物理的なリセットボタンまたは電源スイッチを使用するオペレーターです。
halt
は、-p
/--poweroff
オプションを取得してpoweroff
と同等にしましたが、これは、これらのコマンドのオーバーラップするオプションと自己矛盾するオプションの一般的な増加の兆候です。目撃者 Debian7のUpstarthalt
コマンドのマニュアルページ 。そこにhalt --poweroff
があります。 Debian7のvanSmoorenburg halt
コマンドのマニュアルページ 同様にhalt -p
があります。
しかし、これはsystemdで変更されたものではありません。 systemdは同じものを提供します。 systemd halt
コマンドまたには--poweroff
があります。さらに、--reboot
および(適切な測定のために)--halt
オプションがあります。
互換性のために、 noshツールセットのhalt
/haltsys
コマンド でも同じことをしなければなりませんでした。
コンピュータの電源がオフになっていると単純に古いhalt
と誤って考える可能性があります。しかし、それはUpstartにとっては明らかに間違っていました。また、バグが発生した場合は、onlyがvan Smoorenburgツールセットに当てはまります。 。
今年だけ最終的に修正されたバグは、van Smoorenburghalt
コマンドが-p
オプションの有無を単に無視し、代わりに設定の値に従って停止するか電源を切るかを決定することでした。 /etc/default/halt
で。その設定がたまたま電源オフに設定されている場合、-p
オプションが指定されていなくても、halt
は常に電源オフになります。逆に、その設定を停止に設定した場合、-p
オプションが指定されていても、halt
は常に停止します。
しかしこれはバグであり、文書化された、または意図された動作ではなく、Debianで利用可能なすべてのhalt
コマンドの動作ではなく、一般にhalt
コマンド。
halt
unintentioned changed behaviour。 Debianバグ#743555。