システムを即座にシャットダウンするためのコマンド/プログラム(1〜5秒)はありますか?
更新(2015):電源ソケットの使用をオフにすることを提案してくれた方々に感謝します。 :D
更新(2016): @technophileは、問題の性質を説明する質問にいくつかの情報を追加することを提案しました-主にどのシナリオを解決しようとしていたか。これは、この質問が数年前に尋ねられたシナリオです。
私たちは(空港、ホテルなど)のような公共スペースに配備されるシステムを構築していました。人々は、インターネットサーフィン、電子メールのチェック、またはクレジットカードを使用した予約などにこのシステムを使用できます。システム構築により、キーロガーのようなソフトウェアが何らかの方法でインストールされたとしても、2番目のユーザーがそのシステムの前のユーザーの情報(メール、クレジットカード)を取得できないことが確認されました。システムはそれをどのように確認しましたか?公開情報ではないため、詳細を共有することはできません。しかし、システムの新しいユーザーのために、常に新しいオペレーティングシステム(新しくインストールされたかのように)を使用する方法を開発しました。唯一の問題は、マシンをシャットダウンして、最初のユーザーがマシンを離れたらすぐに再起動する必要があったことです。
そして、私はそのシャットダウンを即座に高速にしたいと思っていました(-それが問題です)、次の起動も非常に高速になりたいので、Damn Small LinuxからSlackware、Debianなど、多数のLinuxディストリビューションを調査して試しましたが、それは別の話。
Sudo shutdown -h now
kill -SEGV 1 # should generate a core dumps and kernel panic
kill -ABRT 1 # should generate a core dumps and kernel panic
kill -9 1 # On old systems worked nowadays not
これは荒くて残忍で、電源コードを抜くのとほぼ同じと見なすことができます...
正しい方法は、必要な場合の前の_Sudo
付きのshutdown -h now
です。
多分私は合法な方法を言うべきです;以下を参照してくださいtl; dr。
いくつかの単語more、別名ストーリー、第I章
最初はinitでしたが、最後まで続きます。
Linux全体は、initのloving careに依存しています [ 1 ] [ 2 ]。それにもかかわらず、ある程度の恩知らずがなければ、良い主rootユーザーこの愛を裏切ることができ、議論の余地のない(-9
)順序で突然kill
initを実行できます。
(Book of Etiquetteは、カウント、デューク、マーキーズのユーザーがSudo
の前に呼び出すことを規定しています)。
次に、いくつかのウィザードはinitを保護するための魅力を作りました(Book of man 2 init
から)
プロセスID 1、initプロセスに送信できる唯一のシグナルは、initが明示的にシグナルハンドラーをインストールしたシグナルです。これは、システムが誤って停止しないようにするためです。
(私たちのスパイレポート [ 1 ] そのinitは1 HUP 6 ABRT 11 SEGV 15 TERM 30 PWR 2 INT 10 USR1 14 ALRM 17 CHLD 32)を処理します
したがって、良い主rootユーザーニュースを学び、kill -ABRT 1
のコマンドを変更しますまたは、通常カーネルパニックとコアダンプを生成するkill -SEGV 1
。
initが実行する最初のプロセスであり、PID番号1を取るため、これは機能します [ 2b ]。
これは安全ではなく、賢明ではなく、あなたはそれが悪い前兆と呪いの先駆けであると感じていますが、もしあなたが物質的に手を置いてそれを抜くことができないなら...
呪い:ログに書き込みません、すべてのプロセスを強制終了せず、プロセスの終了を待ちません。HDDに正しく書き込みませんiノードを更新しても、ファイルシステムはマウント解除されません。グラフィカルウィンドウやシェルの履歴など、想像を超える多くのオプションが保存されることを気にしないでください。電源コードやラップトップの場合はバッテリーを抜くこととほぼ同じです。
正しい方法
"Non nobis、Domine、non nobis、sed nomini tuo da gloriam。"、テンプル騎士団のモットー。
lawful(correct)way is using shutdown
[]
Sudo shutdown -h now
シャットダウンは、システムが安全な方法でダウンするように調整します。ログインしているすべてのユーザーに、システムがダウンしていることが通知されます...
しかし、-h now
を使用すると、それほど多くの時間を過ごすことができなくなります...
いくつかの単語more、別名ストーリー、第II章
昔々、UNIXの人々の上空からいくつかの論理的ステップが感じられました:
システムプロセスが強制終了され、ファイルシステムがマウント解除されると、システムは自動的に停止/電源オフまたは再起動します。これは、変更をディスクに同期してから実際の停止/電源オフまたは再起動を実行するhaltまたはrebootコマンドを使用して行われます。 [ 4 ]
確かに、今日、私たちは3つのモイライの存在にもはや信頼していません [ 5 ]Linuxの世界、reboot
、poweroff
およびhalt
[ 6 ]:ls -l $(which poweroff halt reboot)
のモダンサイエンスとman reboot
の1つは、この暗い時代に新しい光を広げ、すべてを解析する1つの真のコマンドだけが存在することを明らかにしますそれらのオプションにより、コマンド名と矛盾するアクションを最終的に自由に要求できます! (poweroff
の場合はhalt -p
またはreboot -p
、reboot
の場合はshutdown -r
...)
今では、すべてがすべての人にとって明確で居心地の良いように見えたので、噂は [ 7 ]systemd toolsetのunderworldにある [ 8 ]overworld全体に気づかずに革命が起こりました。 後方互換性シムの軍隊のおかげで、再起動、電源オフ、停止にまったく気づきませんでした [ 6 ] そしてtelinit [ 9 ] そしてシャットダウン [] すべてはすでに新しいキングsystemctlにバインドされています [ 1 ]。 JdeBP The Bardのオリジナルの声からストーリー全体を聞いてください [ 9 ] もう息ができないからです。
あなたがUbuntuカルトの信者であるならば、あなたはまだそれらすべての主張についてしばらく気づいているかもしれません [ 11 ]。
halt -f
、init
、telinit
、systemctl
の中地球
正しいものよりも速く、同様に賢明な解決策を検索します。
systemctl --force --force poweroff # the most close to kill -9 1
systemctl --force poweroff # rough but still safe
Sudo halt -f # rough
Sudo telinit 0 # or 6 # safe
kill -SIGINT 1 # cause reboot as the reboot command
kill -SIGRTMIN+4 1 # cause shutdown as the halt command
Systemdの下にあるかどうかにかかわらず、すべての正しいシャウダウン手順を呼び出さずに(さらに高速に)コンピューターを停止できるはずです。
halt -f
:オプション-f
を指定する(シャットダウン手順を回避するには-f
が必要です)上記のコマンド、Sudo poweroff -f
、またはSudo reboot -f -h
実際、シャットダウンを呼び出さないようにオプションman reboot
を指定する必要があるかどうかについて-f
(および同等のもの)から読み取ることができます。
-forceで呼び出された場合、またはランレベル0または6の場合、このツールは、reboot(2)システムコール自体を呼び出します(REBOOTCOMMAND引数が渡されます)。 システムを直接再起動します。
それ以外の場合は、REBOOTCOMMAND引数を渡さずに、適切な引数を指定してshutdown(8)ツールを呼び出すだけです。
-f、-force
shutdown(8)を呼び出さず、代わりに名前から期待される実際のアクションを実行します。
さらに、telinit
を使用できます [ 2b ] (またはinit
を直接)
Sudo telinit 0 # or 6
ランレベルを変更するようにinitに指示します...しかし、もしそうなら、なぜそれを直接殺さないのですか?
Systemdでは、unwise doubleオプション--force --force
を使用できます
systemctl --force --force poweroff
Systemctlマニュアルからの読み取り [ 1 ]
-f、-force
有効化とともに使用すると、既存の競合するシンボリックリンクを上書きします。halt
、poweroff
、reboot
またはkexecとともに使用すると、シャットダウンせずに選択した操作を実行しますすべてのユニット。ただし、すべてのプロセスは強制的に強制終了され、すべてのファイルシステムは読み取り専用でマウント解除または再マウントされます。したがって、これはすぐに再起動を要求するための抜本的ですが比較的安全なオプションです。 これらの操作に--forceが2回指定されている場合、プロセスを終了したり、ファイルシステムをマウント解除したりせずに、それらはすぐに実行されます。警告:--forceを指定しますこれらの操作のいずれかで2回データが失われる可能性があります
Ps>尻尾のバリエーションからインスピレーションを得るJdeBP The Bard [ 7 ]。
Rootとして/ proc/sysrq-triggerに「o」を書き込むことで、ディスクを同期せずにマシンの電源をすぐに切ることができます。
シェルスクリプトとしては、次のようになります。
#!/bin/sh
echo o >/proc/sysrq-trigger
/ proc/sysrq-triggerに対する権限がある場合は、sysctlで有効にする必要はありません。このオプションは、キーボードによるトリガーにのみ影響します。
後で読みたいファイルシステムがあるマシンでこれを行うことはお勧めしません。
これをGoogle Compute Engineで使用して、テンプレートジョブを10分マークの直前に殺し、クラスタージョブの費用対効果を最大化しています。
Magic SysRq key の組み合わせ REISUB
を使用する必要があります。
私の後に繰り返します:「ゾウを育てるのはとても退屈です...」
poweroff
これは、最も一般的なディストリビューションで機能するはずです。 shutdown
とは異なり、多くのシステムでは、これを通常のユーザーとして実行できます(Sudoは不要)。
編集:さらに読む:
電源キーを約4秒間押し続けます。非常に高速です。
この小さなスクリプトを使用してシステムをオフにしました。実際、これは「プロトタイピング」マシンでのいたずらに使用されています。「おいおい、すごい.shが何をするか見てみよう!」
#!/bin/bash
echo 1 > /proc/sys/kernel/sysrq-trigger; #enables sysrq triggers
echo u > /proc/sysrq-trigger # remount the system as ready only
#edited# echo s > /proc/sysrq-trigger # sync all write-pending data to disk
sync
echo o > /proc/sysrq-trigger # shut off the system power.
(このスクリプトは、 Alt + SysRq + u/s/o 前に説明したように。)もちろん、システムの異常終了(mysqlテーブルなどがクラッシュする可能性があります)を引き起こさないため、ダミーマシンでのみ使用します。注:同期には時間がかかる場合があります。システムに大量の空きメモリ(キャッシュ用)があり、大量のファイルをペンドライブにコピーすると、同期に時間がかかりますが、いたずらの場合にもお勧めします。
編集: 's'をsysrq-trigger
に書き込む代わりにsync
を使用することをお勧めします: 's'を書き込んでもスクリプトの実行はブロックされないため、キャッシュをディスクに書き込むように要求すると、マシンはシャットダウンしますすぐにオフ。 sync
コマンドとは対照的に、sync
は書き込みプロセスが完了した後に戻ります。したがって、キャッシュのフラッシュが完了するまで、スクリプトの実行はブロックされます。
特定のLinuxディストリビューションでは、shutdownはオプション-nを提供します。 ( man shutdown を参照してください)。特定のディストリビューション(sysvinitの代わりにupstartを使用するubuntuなど)は彼のフラグをサポートしていません。このフラグは(マンページからわかるように)リスクがないわけではありません。私はこれを何年も使用していますが(私のラップトップではすべてのデーモンが正しく終了することを気にしませんが、すべてを強制終了してディスクキャッシュをフラッシュしたいだけです)(通常のシャットダウンよりも高速で、プラグ(および友達))。これで問題が解決するかどうかを確認できます。