Якщо я запускаю Pi без голови, чи є команда, яку я можу використовувати для безпечного вимкнення, чи мені просто виймати шнур живлення?
poweroff
це, мабуть, символічне посилання на halt
…! 8-)
Якщо я запускаю Pi без голови, чи є команда, яку я можу використовувати для безпечного вимкнення, чи мені просто виймати шнур живлення?
poweroff
це, мабуть, символічне посилання на halt
…! 8-)
Відповіді:
Ви можете безпечно вимкнути пі, використовуючи
shutdown -h now
-H просто зупиняє всі процеси
sudo poweroff
-h
Робить зупинити всю систему - без такий варіант shutdown
буде приймати init
для виконання 1 -го рівня - тобто однокористувальницький режим, чекаючи входу в супер-користувача (корінь пароля). Після входу в систему як root, а потім виходу із системи init
, потім повторюватимуться речі, необхідні для підключення RPi в багатокористувацькому режимі - як це було б під час початкового завантаження (після завершення всіх матеріалів, тобто fsck
тощо, запускаючи /etc/rc.local
це робить тоді). У цьому контексті "вимкнення" - це "зняти систему офлайн для звичайних користувачів" ...
shutdown
насправді потрібен певний час для виконання та відключення будь-яких ssh-клієнтів, поки він працює. Тож як ви знаєте, коли безпечно, наприклад, вийняти SD-карту?
Не відключайте шнур від розетки, оскільки це може час від часу (можливо, часто) призводити до пошкодження файлової системи.
Як каже Impluss, використовуйте shutdown
. Нещодавно я наткнувся на підказку щодо налаштування udev для запуску або перезавантаження, коли певний пристрій USB відключено. Це корисно, якщо система перестала реагувати або втратила мережеве з'єднання, і ви не можете чи не хочете турбуватися про підключення до нього прихованих (пристрій людського інтерфейсу) типу клавіатури.
Є хороший, можливо, м'яко застарілий, але добре написаний, вступ до правил udev | тут | . Основна ідея полягає в тому, щоб ви отримали певну інформацію про пристрій lsusb
, наприклад:
Bus 002 Device 003: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN
Третє поле, позначене ID, - ідентифікатор постачальника та моделі, розділених двокрапкою. Припускаючи, що у вас немає підключених декількох однакових пристроїв, ця комбінація повинна бути унікальною.
Ви можете отримати більш детальну релевантну інформацію через udevadm monitor --udev --property
, яка буде повідомляти про стандарт, поки ви не вб'єте її, наприклад. коли я відключаю шнур wifi donile teenie weenie, він плюється:
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
. Тепер, коли ви виймаєте шнур Wi-Fi, пі має чисто закритись ... дайте йому хвилину, і ви можете відключити живлення (спробуйте це за допомогою екрана, який додається вперше). Ви також можете використати це для перезавантаження - дивіться 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 new runlevel".
Хоча на це питання вже відповіли належним чином; моє уподобання відрізняється від того, на що вже відповіли.
Як казали інші, уникайте просто тягнути владу. Мої вподобані команди (як кореневі, так і допоміжні sudo
):
Для зупинки: halt
(для Wheezy та перед цим команда також вимикає систему; для Jessie вона фактично не перетворюється на живлення, хоча можна витягнути штекер після закінчення) halt -p
; shutdown now -h
або просто poweroff
потрібні Джессі ...
Щоб перезавантажити: reboot
Я віддаю перевагу цим командам, оскільки вони прямі вперед, легко запам’ятовуються і зрозуміли ...
halt
або poweroff
, оскільки вони є лише псевдонімами для shutdown -h now
інструментів GNU, але в інших системах ви негайно вимкнете систему, знищивши всі ваші програми і, можливо, пошкодивши вашу файлову систему. Це сказав, що ви можете використовувати його на малиновому пі в більшості дистрибутивів Linux, але якщо ви використовуєте пі для навчання, ви можете зробити це "правильним способом".
halt
, poweroff
, reboot
І shutdown
все символічні посилання на systemctl
(з оригінальною командою також пройшли). Це запускає відповідну ціль SystemD: напр poweroff.target
. FWIW poweroff.target
запускає дзвінок ACPI для чистого відключення системи. Тож AFAIK в цей день і вік poweroff
(або systemctl poweroff
) "правильний шлях". :)
--no-preserve-root
прапор. Не покладайтеся на / bin / sh being / bin / bash (це навіть не стосується систем на базі Debian). Часто корисно намагатися використовувати «правильний» спосіб, навіть якщо це в даний час буде працювати іншим способом.
/bin/bash
. FYI мій погляд дуже орієнтований на Debian ...
Просто для того, щоб кинути його, якщо ви додаєте трохи обладнання, ви можете написати невеликий демон, щоб опитувати шпильки GPIO і після затвердження певного штифта, перезавантажте (або вимкніть) Pi.
Крім того, всі команди, згадані тут, можуть працювати над SSH.
Я знаю, що минуло 3 роки після початкового питання. Але я щойно отримав свій Raspberry Pi, і у мене виникли проблеми з його вимкненням, якщо я забув підключити його до екрана монітора, і він не має жодного мережного підключення.
Я написав невеликий скрипт Python, щоб автоматично вимкнути його протягом 60 секунд, підключивши thumbdrive, що містить файл під назвою "pi_auto_shutdown".
Просто зателефонуйте до цього сценарію з 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()
Я SSH в мою скриньку RPI з допомогою команди
$ ssh rpi sudo poweroff
rpi - псевдонім для IP-адреси мого поля RPi і визначається у файлі ~ / .ssh / config .