Якщо я запускаю 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 .