Piヘッドレスを実行している場合、安全にシャットダウンするために使用できるコマンドはありますか、それとも単に電源コードを取り外す必要がありますか?
poweroff
おそらくhalt
... へのシンボリックリンクです!8
Piヘッドレスを実行している場合、安全にシャットダウンするために使用できるコマンドはありますか、それとも単に電源コードを取り外す必要がありますか?
poweroff
おそらくhalt
... へのシンボリックリンクです!8
回答:
を使用してpiを安全にシャットダウンできます
shutdown -h now
-hはすべてのプロセスを停止します
sudo poweroff
-h
ない停止 -システム全体をせずに、そのオプションがshutdown
かかりますinit
つまり、シングルユーザーモード、スーパーユーザログイン(必要に応じてrootのパスワード)を待っている-実行レベルに1を。ルートとしてログインした後、その後、ログアウトすると、init
その後、マルチユーザーモードでRPIを育てるために必要なものをやり直します-それはすなわち、すべてのものの完了後に元のブートアップ(中に行うようにfsck
実行されている、など/etc/rc.local
ということその後)。このコンテキストでは、「シャットダウン」は「通常のユーザーのためにシステムをオフラインにする」です
shutdown
実際には実行に時間がかかり、実行中のsshクライアントを切断します。たとえば、SDカードを取り外すなど、安全であることがいつわかるのでしょうか。
単にコードを抜かないでください。ファイルシステムが破損する場合があります(おそらく)。
Implussが言うように、を使用しますshutdown
。最近、特定のUSBデバイスが抜かれたときにシャットダウンまたはリブートをトリガーするようにudevを設定するというヒントに出くわしました。これは、システムが応答しなくなったり、ネットワーク接続が失われたり、キーボードなどのhid(ヒューマンインターフェイスデバイス)をプラグインすることができない、または気にしない場合に便利です。
良い、おそらく少し時代遅れですが、よく書かれた、udevルールの紹介があります|こちら| 。基本的な考え方はlsusb
、たとえば、デバイスに関する情報を取得することです:
Bus 002 Device 003: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN
IDというラベルが付いた3番目のフィールドは、コロンで区切られたベンダーとモデルIDです。複数の同一のデバイスが接続されていない場合、この組み合わせは一意である必要があります。
より詳細な関連情報を取得するにはudevadm monitor --udev --property
、を使用します。10代のweenie wifiドングルを上から外すと、吐き出します。
UDEV [2834.504860] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6 (usb)
ACTION=remove
[...]
ID_BUS=usb
ID_MODEL=802.11n_WLAN_Adapter
ID_MODEL_ENC=802.11n\x20WLAN\x20Adapter
ID_MODEL_ID=8176
[...]
ID_VENDOR=Realtek
ID_VENDOR_ENC=Realtek
ID_VENDOR_ID=0bda
ID_MODELおよびID_VENDORフィールドに注意してください。これらは、udevルールで使用するものです。オンラインでATTRフィールドの使用を推奨する古いソースまたは誤ったソースがいくつかありますが、これらは「削除」イベントに関するENVフィールドです。
でファイルを作成します/etc/udev/rules.d
。これは、分布に関係なく同じです。ファイルの最後になければならず.rules
、このディレクトリ内のすべてのファイルは辞書式に処理されます。先に宣言したルールが優先されると思うので、使用00-my_pi.rules
すると行の先頭に保持されます(数字は文字の前にソートされます)。その中に次のような行を追加します。
ACTION=="remove", ENV{ID_VENDOR_ID}=="0bda", ENV{ID_MODEL_ID}=="8176", RUN+="/sbin/shutdown -h now"
用心==
していません=
。後者を使用する場合、基準は無意味です。 その場合、すべてのイベントに一致するudevルールになる可能性があります!
これがでロードされていることを確認してくださいudevadm control --reload-rules
。これで、wifiドングルを引っ張ると、piがきれいにシャットダウンするはずです...それをするのに1分間待ってから、電源を抜くことができます(最初に画面を接続してこれを試してください)。また、これを使用して再起動することもできます- man shutdown
ここに記載されているすべてのコマンドのmanページをご覧ください。
shutdown -h now
Linuxでは==)と入力できるという事実により、そのような必要性が緩和される可能性があります;)
次のコマンドを発行してシャットダウンできます。
sudo init 0
再起動するには:
sudo init 6
sudo telinit #
、#が0から6までの数である場合の使用が適切であると考えられます-telinitは、プライマリ名「init」によって呼び出されていないことを認識するinitへのシンボリックリンクです(PIDがありません) 1!)したがって、実際の「init」プロセスへのパイプを作成し、現在のランレベルを数値引数として指定された新しい値に変更するように指示します。 telinit
「tell init the new runlevel」の短縮形です。
質問はすでに適切に回答されていますが、私の好みはすでに答えられているものとは異なります。
他の人が言ったように、ただ力を抜かないでください。私の好みのコマンド(ルートとして、またはで始まるsudo
):
停止するには:halt
(Wheezy以前の場合、このコマンドはシステムの電源もオフにします。Jessieの場合、プラグは一度終了しても安全ですが、実際には電源がオフになりません)halt -p
。shutdown now -h
または単にpoweroff
ジェシーに必要です...
再起動するには: reboot
これらのコマンドは簡単で、覚えやすく、自明であるため、私はこれらのコマンドを好みます...
halt
またはを使用する習慣を身に付けないでください。poweroff
これらはshutdown -h now
GNUツールのエイリアスにすぎませんが、他のシステムではすぐにシステムの電源をオフにし、すべてのプログラムを強制終了し、ファイルシステムを破壊します。これは、ほとんどのLinuxディストリビューションのラズベリーpiで使用できますが、学習にpiを使用する場合は、「正しい方法」でそれを行うことができます。
halt
、poweroff
、reboot
およびshutdown
にすべてのシンボリックリンクされているsystemctl
(また、渡された元のコマンドでは)。次に、適切なSystemDターゲットをトリガーしますpoweroff.target
。FWIW poweroff.target
はACPI呼び出しをトリガーして、システムを完全にシャットダウンします。ですから、この日と年齢のAFAIK poweroff
(またはsystemctl poweroff
)は「正しい方法」です。:)
--no-preserve-root
フラグを立てないでください。/ bin / shが/ bin / bashであることに依存しないでください(これは、Debianベースのシステムには当てはまりません)。現在は別の方法で動作する場合でも、「正しい」方法を使用しようとすると便利です。
/bin/bash
。FYI私の視点は...非常にDebianの中心である
ちょっとだけハードウェアを追加する場合は、小さなデーモンを作成してGPIOピンをポーリングし、特定のピンがアサートされたらPiを再起動(またはシャットダウン)できます。
また、ここで説明したすべてのコマンドはSSHで実行できます。
元の質問から3年が経過したことを知っています。しかし、Raspberry Piを手に入れたばかりで、モニター画面に接続するのを忘れていて、ネットワーク接続がない場合、シャットダウンできません。
「pi_auto_shutdown」という名前のファイルを含むサムドライブを差し込むことで、60秒以内に自動的にシャットダウンする小さなPythonスクリプトを作成しました。
このスクリプトをrc.localから呼び出すだけです。
これがお役に立てば幸いです。
shutdown_loop_delay = 60
shutdown_flag_file = 'pi_auto_shutdown'
def poll_shutdown_flag():
"""check whether a shutdown flag file in a usb drive exists"""
## run mount command
## sample mount output: "/dev/sda1 on /media/path/"
output, error = subprocess.Popen('mount', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
if len(error) > 0:
log('mount error: {}'.format(error))
return False
## parse mount output
for output_line in output.split('\n'):
output_words = output_line.split(' ')
if len(output_words) < 3:
continue
if output_words[0].startswith('/dev/sd'):
flag_file_path = os.path.join(output_words[2], shutdown_flag_file)
if os.path.isfile(flag_file_path):
return True
return False
def shutdown():
"""shutdown the system immediately"""
subprocess.Popen('sudo shutdown -h now', shell=True).communicate()
def loop_shutdown():
while True:
time.sleep(shutdown_loop_delay)
if poll_shutdown_flag():
shutdown()
loop_shutdown()