Jika saya menjalankan Pi tanpa kepala, apakah ada perintah yang dapat saya gunakan untuk mematikan dengan aman, atau haruskah saya melepas kabel daya saja?
poweroff
mungkin merupakan tautan simbolis ke halt
...! 8-)
Jika saya menjalankan Pi tanpa kepala, apakah ada perintah yang dapat saya gunakan untuk mematikan dengan aman, atau haruskah saya melepas kabel daya saja?
poweroff
mungkin merupakan tautan simbolis ke halt
...! 8-)
Jawaban:
Anda dapat mematikan pi dengan aman
shutdown -h now
-H hanya menghentikan semua proses
sudo poweroff
-h
tidak menghentikan seluruh sistem - tanpa opsi yang shutdown
akan mengambil init
untuk menjalankan tingkat 1 - yaitu, modus single user, menunggu super-user login (password root diperlukan). Setelah login sebagai root dan kemudian keluar log init
maka 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 fsck
dll, berjalan /etc/rc.local
itu lakukan kemudian). Dalam konteks ini "shutdown" adalah "mengambil sistem off-line untuk pengguna normal" ...
shutdown
sebenarnya membutuhkan waktu untuk mengeksekusi, dan memutus klien ssh saat itu. Jadi, bagaimana Anda tahu kapan aman untuk, misalnya, mengeluarkan kartu SD?
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 .rules
dan semua file dalam direktori ini diproses secara leksikografis. Saya percaya aturan yang dideklarasikan sebelumnya diutamakan, jadi menggunakan 00-my_pi.rules
akan 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;)
shutdown -h now
di linux) mungkin mengurangi kebutuhan akan hal seperti itu;)
Anda dapat mengeluarkan perintah berikut untuk mematikan:
sudo init 0
Dan untuk reboot:
sudo init 6
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 . telinit
adalah kontraksi dari "kirim init runlevel baru".
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 -h
atau hanya poweroff
diperlukan untuk Jessie ...
Untuk me-reboot: reboot
Saya lebih suka perintah-perintah ini karena mereka lurus ke depan, mudah diingat dan jelas ...
halt
atau poweroff
, karena mereka hanya alias shutdown -h now
dengan 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".
halt
, poweroff
, reboot
Dan shutdown
semua symlink ke systemctl
(dengan perintah asli juga lulus). Itu kemudian memicu target SystemD yang sesuai: mis poweroff.target
. FWIW poweroff.target
memicu panggilan ACPI untuk mematikan sistem dengan bersih. Jadi AFAIK di zaman sekarang ini poweroff
(atau systemctl poweroff
) ADALAH "jalan yang benar". :)
--no-preserve-root
bendera. 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.
/bin/bash
. FYI perspektif saya sangat sentris-sentris ...
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.
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()
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 .