Cara mematikan RPi saat menjalankan tanpa kepala

33

Jika saya menjalankan Pi tanpa kepala, apakah ada perintah yang dapat saya gunakan untuk mematikan dengan aman, atau haruskah saya melepas kabel daya saja?

Eric Wilson
sumber
poweroff adalah cara terbaik untuk mematikannya
RahulAN
poweroffmungkin merupakan tautan simbolis ke halt...! 8-)
SlySven

Jawaban:

40

Anda dapat mematikan pi dengan aman

shutdown -h now

-H hanya menghentikan semua proses

Impuls
sumber
7
Mungkin perlu belajar pada saat yang sama bahwa -r akan melakukan restart (shutdown + reboot).
XTL
6
Jangan lupa Anda harus root untuk mematikan atau menggunakan sudo.
keiki
1
Atausudo poweroff
berto
3
The -htidak menghentikan seluruh sistem - tanpa opsi yang shutdownakan mengambil inituntuk menjalankan tingkat 1 - yaitu, modus single user, menunggu super-user login (password root diperlukan). Setelah login sebagai root dan kemudian keluar log initmaka akan mengulang hal-hal yang diperlukan untuk membawa RPI dalam mode multi-user - karena akan lakukan selama asli boot-up (setelah selesai semua hal, yaitu fsckdll, berjalan /etc/rc.localitu lakukan kemudian). Dalam konteks ini "shutdown" adalah "mengambil sistem off-line untuk pengguna normal" ...
SlySven
Ya, tetapi shutdownsebenarnya membutuhkan waktu untuk mengeksekusi, dan memutus klien ssh saat itu. Jadi, bagaimana Anda tahu kapan aman untuk, misalnya, mengeluarkan kartu SD?
Tom Auger
40

Jangan hanya mencabut kabelnya, karena hal ini kadang-kadang (mungkin, sering) menyebabkan korupsi sistem file.

Seperti yang dikatakan Impluss, gunakan shutdown. Baru-baru ini saya menemukan tip tentang mengkonfigurasi udev untuk memicu shutdown atau reboot ketika perangkat usb tertentu dicabut. Ini berguna jika sistem menjadi tidak responsif atau telah kehilangan koneksi jaringan dan Anda tidak dapat atau tidak akan repot-repot memasang plugging (perangkat antarmuka manusia) seperti keyboard ke dalamnya.

Ada pengantar yang baik, mungkin agak ketinggalan zaman tetapi ditulis dengan baik, untuk aturan udev | di sini | . Ide dasarnya adalah Anda mendapatkan beberapa informasi tentang perangkat melalui lsusb, misalnya:

Bus 002 Device 003: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN

Kolom ketiga berlabel ID adalah vendor dan id model yang dipisahkan oleh titik dua. Anggap Anda tidak memiliki beberapa perangkat yang identik terhubung, kombinasi ini harus unik.

Anda dapat memperoleh informasi relevan yang lebih terperinci melalui udevadm monitor --udev --property, yang akan melaporkan ke standar sampai Anda membunuhnya, misalnya. ketika saya mencabut dongle wifi weenie teenie dari atas itu meludahi:

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

Perhatikan bidang ID_MODEL dan ID_VENDOR. Inilah yang ingin Anda gunakan dalam aturan udev Anda. Ada beberapa sumber online yang kedaluwarsa atau tidak benar yang menyarankan penggunaan bidang ATTR, tetapi ini adalah bidang ENV terkait dengan peristiwa "hapus".

Buat file dalam /etc/udev/rules.d. Ini sama terlepas dari distribusinya. File harus diakhiri .rulesdan semua file dalam direktori ini diproses secara leksikografis. Saya percaya aturan yang dideklarasikan sebelumnya diutamakan, jadi menggunakan 00-my_pi.rulesakan tetap di garis depan (nomor urut sebelum huruf). Di dalamnya tambahkan baris seperti:

ACTION=="remove", ENV{ID_VENDOR_ID}=="0bda", ENV{ID_MODEL_ID}=="8176", RUN+="/sbin/shutdown -h now"

Waspadalah ==dan tidak =. Jika Anda menggunakan nanti, kriteria tidak ada artinya. Dalam hal ini Anda bisa berakhir dengan aturan udev yang cocok dengan acara apa pun!

Pastikan ini dimuat dengan udevadm control --reload-rules. Sekarang ketika Anda mencabut dongle wifi, pi harusnya shutdown dengan bersih ... beri waktu sebentar untuk melakukan itu dan Anda kemudian dapat mencabut daya (coba ini dengan layar terpasang pertama kali). Anda juga dapat menggunakan ini untuk mem-boot ulang - lihat man shutdown, dan, sebenarnya, halaman manual untuk semua perintah yang disebutkan di sini;)

goldilocks
sumber
3
Saya tidak berpikir inilah yang diminta OP. Tapi +1 untuk info.
Vincent P
Rapi! Tentu saja Anda juga harus dapat menghapus (atau menghubungkan) perangkat USB yang berubah-ubah memicu ini
Tobias Kienzler
Ini awal yang bagus. Mendapatkan shutdown dipicu oleh tombol GPIO (cara apa pun untuk mendapatkan sesuatu seperti itu ke ACPI atau acara HID?) Atau sesuatu akan lebih berguna.
XTL
@XTL: Ada daemon apci di sekitar, jadi ada kemungkinan (kernel melaporkan melalui proc, dll). Hal yang sama setidaknya berpotensi berlaku untuk gpio pada pi. Peristiwa HID lebih kontekstual (contoh konteks menjadi lingkungan desktop GUI) dan fakta bahwa Anda dapat mengetik "berhenti" (== shutdown -h nowdi linux) mungkin mengurangi kebutuhan akan hal seperti itu;)
goldilocks
Ini sempurna, dongle adalah satu-satunya yang terhubung ke Pi kami, dan kami sering kehilangan koneksi sehingga kami perlu memindahkannya, tanpa merusaknya dari kehilangan daya.
noio
8

Anda dapat mengeluarkan perintah berikut untuk mematikan:

sudo init 0

Dan untuk reboot:

sudo init 6
Pengguna Terdaftar
sumber
Ini sangat tergantung pada level run sebagai konsep sistem operasi masih menggunakan. Pergeseran ke systemd membuat ini kurang dapat digunakan saat ini.
Stephen Michael Kellat
Tidak termasuk hasil edit mulai hari ini, Anda mungkin telah memperhatikan bahwa ini adalah jawaban yang cukup lama. Pertanyaannya juga lebih besar dari dua tahun.
Pengguna Terdaftar
1
Dalam penggunaan ini dianggap lebih baik untuk menggunakan di sudo telinit #mana # adalah angka antara 0 dan 6 - telinit adalah tautan simbolis ke init yang mengakui bahwa ia tidak dipanggil dengan nama utamanya "init" (dan bahwa ia tidak memiliki PID dari 1!) Sehingga ia menciptakan sebuah pipa ke proses "init" yang sebenarnya dan menyuruhnya untuk mengubah runlevel saat ini ke nilai baru yang dinyatakan sebagai argumen numerik . telinitadalah kontraksi dari "kirim init runlevel baru".
SlySven
7

Metode pilihan saya adalah menggunakan sudo poweroff, yang merupakan alias untuk perintah mematikan yang juga membunuh penggunaan daya.

sdenton4
sumber
7

Sementara pertanyaan sudah dijawab dengan memadai; preferensi saya berbeda dengan apa yang sudah dijawab.

Seperti yang orang lain katakan hindari hanya menarik kekuatan. Perintah pilihan saya (baik sebagai root atau prepend dengan sudo):

Untuk menghentikan: halt(untuk Wheezy dan sebelum perintah ini juga mematikan sistem; untuk Jessie sebenarnya tidak mematikan meskipun aman untuk menarik steker setelah selesai) halt -p; shutdown now -hatau hanya poweroffdiperlukan untuk Jessie ...

Untuk me-reboot: reboot

Saya lebih suka perintah-perintah ini karena mereka lurus ke depan, mudah diingat dan jelas ...

Jeremy Davis
sumber
Jangan bermaksud untuk mengeluh, tetapi saya pikir itu agak keras bahwa jawaban saya (dari 8 bulan lalu) telah dibatalkan karena Debian (yaitu hulu Raspbian) mengubah cara kerja perintah mereka (dengan asumsi itulah sebabnya saya turun memilih) . Juga jawaban saya (sebelum diedit) masih menjawab OP (yaitu jika Anda menghentikan sistem aman untuk menarik steker ...) FWIW Saya telah memperbarui jawabannya sehingga jelas bahwa ini tidak lagi berfungsi sebagai pengguna mungkin harap ...
Jeremy Davis
Anda seharusnya tidak memiliki kebiasaan untuk menggunakan haltatau poweroff, karena mereka hanya alias shutdown -h nowdengan alat GNU, tetapi pada sistem lain Anda akan mematikan sistem Anda segera, membunuh semua program Anda dan mungkin merusak sistem file Anda. Ini mengatakan, Anda dapat menggunakannya pada raspberry pi dengan sebagian besar distribusi linux, tetapi jika Anda menggunakan pi untuk belajar, Anda mungkin ingin melakukannya "dengan cara yang benar".
allo
@allo - Anda mungkin benar untuk OS Linux lawas dan varian OS non-Linux non-Linux lainnya (mis. BSD) juga. Tetapi dalam OS Linux yang lebih baru yang menggunakan SystemD (yaitu kebanyakan Linux hari ini) itu tidak terjadi. halt, poweroff, rebootDan shutdownsemua symlink ke systemctl(dengan perintah asli juga lulus). Itu kemudian memicu target SystemD yang sesuai: mis poweroff.target. FWIW poweroff.targetmemicu panggilan ACPI untuk mematikan sistem dengan bersih. Jadi AFAIK di zaman sekarang ini poweroff(atau systemctl poweroff) ADALAH "jalan yang benar". :)
Jeremy Davis
Seperti dalam banyak kasus dengan linux, ada lebih dari satu cara untuk melakukannya. Tetapi Anda harus mempertimbangkan jika Anda tidak ingin mempelajarinya, yang dijelaskan dalam standar, yang diikuti oleh sistem unix lainnya. Ada sedikit manfaat bagi Anda sebagai pengguna linux, tetapi siapa yang tahu kapan Anda akan mencoba beberapa sistem lain di masa depan? jangan mengandalkan berhenti dan jangan mengandalkan rm untuk memiliki --no-preserve-rootbendera. Jangan mengandalkan / bin / sh menjadi / bin / bash (ini bahkan tidak berlaku untuk sistem berbasis debian lagi). Seringkali berguna untuk mencoba menggunakan cara yang "benar", meskipun saat ini akan bekerja dengan cara lain.
allo
1
@allo - Poin yang adil dan saya pikir itu sangat luar biasa bagi Anda untuk berbagi pengetahuan Anda tentang sistem yang berbeda dan saya setuju bahwa tentu saja patut dicatat perbedaan antara sistem dan batasan yang relevan. Meskipun saya tidak setuju dengan saran Anda bahwa jalan Anda adalah cara yang "benar". Mungkin cara "posix compliant", tetapi itu tidak membuat satu cara "benar" dan yang lain "salah". Misalnya menggunakan bash (dan bashisme) adalah IMO yang benar-benar sah, meskipun saya setuju bahwa jika Anda memerlukan / menginginkan bash, maka Anda harus menggunakan secara eksplisit /bin/bash. FYI perspektif saya sangat sentris-sentris ...
Jeremy Davis
4

Hanya untuk melemparkannya, jika Anda ingin menambahkan sedikit perangkat keras, Anda dapat menulis daemon kecil untuk polling pin GPIO dan setelah penegasan pin tertentu, reboot (atau shutdown) Pi.

Juga, semua perintah yang disebutkan di sini dapat dijalankan melalui SSH.

Maxthon Chan
sumber
3

Saya tahu ini 3 tahun setelah pertanyaan awal. Tapi saya baru saja mendapatkan Raspberry Pi saya dan saya mengalami kesulitan mematikannya jika saya lupa menghubungkannya ke layar monitor dan tidak memiliki koneksi jaringan.

Saya telah menulis skrip Python kecil untuk secara otomatis mematikannya dalam waktu 60 detik dengan cara menghubungkannya dengan thumbdrive yang berisi file bernama "pi_auto_shutdown".

Panggil saja skrip ini dari rc.local.

Saya harap ini membantu.

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()
VoidMain
sumber
Pendekatan yang menarik.
Eric Wilson
1

Saya ssh ke dalam kotak RPi saya menggunakan perintah

$ ssh rpi sudo poweroff

rpi adalah alias untuk Alamat IP kotak RPi saya dan didefinisikan dalam file ~ / .ssh / config .

ismartbuoy
sumber