ヘッドレス実行中にRPiをシャットダウンする方法


33

Piヘッドレスを実行している場合、安全にシャットダウンするために使用できるコマンドはありますか、それとも単に電源コードを取り外す必要がありますか?



poweroffおそらくhalt... へのシンボリックリンクです!8
SlySven

回答:


40

を使用してpiを安全にシャットダウンできます

shutdown -h now

-hはすべてのプロセスを停止します


7
-rが再起動(シャットダウン+再起動)を行うのと同時に学習する価値があるかもしれません。
XTL

6
シャットダウンするかsudoを使用するには、rootになる必要があることを忘れないでください。
ケイキ

1
またはsudo poweroff
15

3
-hない停止 -システム全体をせずに、そのオプションがshutdownかかりますinitつまり、シングルユーザーモード、スーパーユーザログイン(必要に応じてrootのパスワード)を待っている-実行レベルに1を。ルートとしてログインした後、その後、ログアウトすると、initその後、マルチユーザーモードでRPIを育てるために必要なものをやり直します-それはすなわち、すべてのものの完了後に元のブートアップ(中に行うようにfsck実行されている、など/etc/rc.localということその後)。このコンテキストでは、「シャットダウン」は「通常のユーザーのためにシステムをオフラインにする」です
...-SlySven

はい。ただし、shutdown実際には実行に時間がかかり、実行中のsshクライアントを切断します。たとえば、SDカードを取り外すなど、安全であることがいつわかるのでしょうか。
トム・オージェ

40

単にコードを抜かないでください。ファイルシステムが破損する場合があります(おそらく)。

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ページをご覧ください。


3
私はこれがOPが求めていたものだとは思わない。しかし、情報のために+1。
ビンセントP

きちんとした!もちろん、任意のUSBデバイスの取り外し(またはプラグイン)でこれをトリガーできるようにする必要があります
トビアスキーンズラー

これはいいスタートです。GPIOボタンによってトリガーされるシャットダウンを取得する(ACPIまたはHIDイベントにそのような何かを取得する方法はありますか)または何かがさらに便利です。
XTL

@XTL:周りにapciデーモンがありますので、可能です(カーネルはprocなどを介して報告します)。同じことは、少なくともpiのgpioに当てはまる可能性があります。HIDイベントはよりコンテキストに依存し(GUIデスクトップ環境であるコンテキストの例)、「halt」(shutdown -h nowLinuxでは==)と入力できるという事実により、そのような必要性が緩和される可能性があります;)
goldilocks

これは完璧です。Piに接続されるのはドングルだけです。接続が失われることがよくあるので、電力損失で破損することなく移動する必要があります。
-noio

8

次のコマンドを発行してシャットダウンできます。

sudo init 0

再起動するには:

sudo init 6

これは、オペレーティングシステムがまだ使用している概念である実行レベルに大きく依存しています。systemdへの移行により、最近ではこれが使いにくくなっています。
スティーブンマイケルケラット

今日の編集を除くと、これはかなり古い答えであることに気づいたかもしれません。質問も2年以上前です。
登録ユーザー

1
この使用法ではsudo telinit #、#が0から6までの数である場合の使用が適切であると考えられます-telinitは、プライマリ名「init」によって呼び出されていないことを認識するinitへのシンボリックリンクです(PIDがありません) 1!)したがって、実際の「init」プロセスへのパイプを作成し、現在のランレベルを数値引数として指定された新しい値変更するように指示しますtelinit「tell init the new runlevel」の短縮形です。
SlySven

7

私が好む方法は、を使用することですsudo poweroff。これは、シャットダウンコマンドのエイリアスであり、電力の使用も停止します。


7

質問はすでに適切に回答されていますが、私の好みはすでに答えられているものとは異なります。

他の人が言ったように、ただ力を抜かないでください。私の好みのコマンド(ルートとして、またはで始まるsudo):

停止するには:halt(Wheezy以前の場合、このコマンドはシステムの電源もオフにします。Jessieの場合、プラグは一度終了しても安全ですが、実際には電源が​​オフになりません)halt -pshutdown now -hまたは単にpoweroffジェシーに必要です...

再起動するには: reboot

これらのコマンドは簡単で、覚えやすく、自明であるため、私はこれらのコマンドを好みます...


意地悪をするつもりはありませんが、Debian(つまりRaspbianの上流)がコマンドの動作方法を変更したために(8か月前から)私の答えがダウン投票されたのは少し厳しいと思います(だから私は投票しなかったのです) 。また、私の編集(編集前)はまだOPに答えていました(つまり、システムを停止した場合、プラグを抜いても安全です...)FWIW答えを更新したので、ユーザーとしては機能しないことが明らかです希望...
ジェレミー・デイビス

haltまたはを使用する習慣を身に付けないでください。poweroffこれらはshutdown -h nowGNUツールのエイリアスにすぎませんが、他のシステムではすぐにシステムの電源をオフにし、すべてのプログラムを強制終了し、ファイルシステムを破壊します。これは、ほとんどのLinuxディストリビューションのラズベリーpiで使用できますが、学習にpiを使用する場合は、「正しい方法」でそれを行うことができます。
-allo

@allo-レガシーLinux OSやその他のLinux以外のUnixのようなOS(例:BSD)バリアントも正しいかもしれません。しかし、SystemDを使用する最近のLinux OS(最近のほとんどのLinux)ではそうではありません。haltpoweroffrebootおよびshutdownにすべてのシンボリックリンクされているsystemctl(また、渡された元のコマンドでは)。次に、適切なSystemDターゲットをトリガーしますpoweroff.target。FWIW poweroff.targetはACPI呼び出しをトリガーして、システムを完全にシャットダウンします。ですから、この日と年齢のAFAIK poweroff(またはsystemctl poweroff)は「正しい方法」です。:)
ジェレミーデイビス

Linuxでの多くの場合のように、それを行う方法は複数あります。しかし、標準で説明されている方法で学習したくない場合は、他のUNIXシステムも同様に考慮する必要があります。Linuxユーザーとしてのあなたにはほとんどメリットはありませんが、将来、他のシステムをいつ試してみるのか誰が知っていますか?停止に依存せず、rmに依存して--no-preserve-rootフラグを立てないでください。/ bin / shが/ bin / bashであることに依存しないでください(これは、Debianベースのシステムには当てはまりません)。現在は別の方法で動作する場合でも、「正しい」方法を使用しようとすると便利です。
アロ

1
@allo-公平な点です。異なるシステムの知識を共有することは本当に素晴らしいことだと思います。システムと関連する制限の違いに注目する価値があることは確かです。あなたのやり方は「正しい」方法であるというあなたの提案には同意しませんが。それは「posix準拠」の方法かもしれませんが、一方を「正しく」、もう一方を「間違った」ものにするわけではありません。たとえば、bash(およびbashisms)の使用は完全に正当なIMOです。ただし、bashが必要/必要な場合は、明示的にを使用する必要があることに同意します/bin/bash。FYI私の視点は...非常にDebianの中心である
ジェレミー・デイビス

4

ちょっとだけハードウェアを追加する場合は、小さなデーモンを作成してGPIOピンをポーリングし、特定のピンがアサートされたらPiを再起動(またはシャットダウン)できます。

また、ここで説明したすべてのコマンドはSSHで実行できます。


3

元の質問から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()

興味深いアプローチ。
エリックウィルソン

1

コマンドを使用してRPiボックスにsshします

$ ssh rpi sudo poweroff

rpiは私のRPiボックスのIPアドレスのエイリアスで、〜/ .ssh / configファイルで定義されています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.