Si je lance un Pi sans tête, puis-je utiliser une commande pour éteindre en toute sécurité ou dois-je simplement retirer le cordon d'alimentation?
poweroff
est probablement un lien symbolique vers halt
...! 8-)
Si je lance un Pi sans tête, puis-je utiliser une commande pour éteindre en toute sécurité ou dois-je simplement retirer le cordon d'alimentation?
poweroff
est probablement un lien symbolique vers halt
...! 8-)
Réponses:
Vous pouvez arrêter le pi en toute sécurité en utilisant
shutdown -h now
Le -h arrête tous les processus
sudo poweroff
-h
t arrêter l'ensemble du système - sans cette option shutdown
prendra init
pour exécuter niveau 1 - à savoir, en mode utilisateur unique, en attente d'une connexion super-utilisateur (mot de passe root nécessaire). Une fois connecté en tant que root puis vous déconnecter init
ensuite refaire les choses nécessaires pour mettre l'IPD en mode multi-utilisateur - comme il le ferait au cours de la démarrage d' origine (après la fin de toutes les choses, par exemple , fsck
etc., en cours d' exécution /etc/rc.local
que fait alors). Dans ce contexte, "l'arrêt" consiste à "mettre le système hors ligne pour les utilisateurs normaux" ...
shutdown
prend un peu de temps à exécuter et déconnecte tous les clients ssh tant qu’ils sont là. Comment savoir, par exemple, s'il est sûr de retirer la carte SD?
Ne débranchez pas simplement le cordon, car cela pourrait occasionnellement (peut-être souvent) entraîner une corruption du système de fichiers.
Comme dit Impluss, utilisez shutdown
. J'ai récemment rencontré un conseil sur la configuration d'udev pour déclencher l'arrêt ou le redémarrage lorsqu'un périphérique USB spécifique est débranché. Ceci est utile si le système ne répond plus ou a perdu une connexion réseau et que vous ne pouvez plus vous occuper de brancher des éléments cachés (périphérique à interface humaine) comme un clavier.
Il y a une bonne introduction, peut-être légèrement dépassée, mais bien écrite, aux règles d'udev | ici | . L’idée de base est que vous obtenez des informations sur le périphérique vialsusb
, par exemple:
Bus 002 Device 003: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN
Le troisième champ intitulé ID correspond au fournisseur et à l'identifiant du modèle, séparés par deux points. En supposant que vous n'avez pas plusieurs appareils identiques branchés, cette combinaison doit être unique.
Vous pouvez obtenir des informations pertinentes plus détaillées via udevadm monitor --udev --property
, qui feront rapport au standard jusqu'à ce que vous le détruisiez, par exemple lorsque je débranche le dongle wifi teenie weenie d'en haut, il crache:
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
Notez les champs ID_MODEL et ID_VENDOR. Ce sont ce que vous voulez utiliser dans votre règle udev. Certaines sources en ligne obsolètes ou incorrectes suggèrent d'utiliser des champs ATTR, mais il s'agit de champs ENV pour un événement "remove".
Créez un fichier dans /etc/udev/rules.d
. C'est la même quelle que soit la distribution. Le fichier doit se terminer .rules
et tous les fichiers de ce répertoire sont traités lexicographiquement. Je crois que les règles déclarées précédemment ont la priorité. Par conséquent, si vous utilisez 00-my_pi.rules
cette option, vous gardez cette option au premier plan (les chiffres sont classés avant les lettres). Ajoutez une ligne comme celle-ci:
ACTION=="remove", ENV{ID_VENDOR_ID}=="0bda", ENV{ID_MODEL_ID}=="8176", RUN+="/sbin/shutdown -h now"
Attention ==
et pas =
. Si vous utilisez ce dernier critère, le critère n'a pas de sens. Dans ce cas, vous pourriez vous retrouver avec une règle udev qui correspond à n’importe quel événement!
Assurez-vous que c'est chargé avec udevadm control --reload-rules
. Maintenant, lorsque vous retirez le dongle wifi, le pi doit s'arrêter proprement ... laissez-lui une minute pour le faire et vous pourrez alors débrancher l'alimentation (essayez ceci avec un écran attaché la première fois). Vous pouvez également utiliser ceci pour redémarrer - voir man shutdown
et, en fait, la page de manuel de toutes les commandes mentionnées ici;)
shutdown -h now
sur linux) en atténue peut-être la nécessité;
Vous pouvez émettre la commande suivante à l’arrêt:
sudo init 0
Et pour redémarrer:
sudo init 6
sudo telinit #
# où est un nombre compris entre 0 et 6 - telinit est un lien symbolique vers init qui reconnaît qu'il n'est pas appelé par son nom principal "init" (et qu'il n'a pas de PID de 1!), Il crée donc un canal vers le processus "init" réel et lui dit de modifier le niveau d'exécution actuel en fonction de la nouvelle valeur indiquée en tant qu'argument numérique . telinit
est une contraction de "tell init the new runlevel".
Bien que la question ait déjà reçu une réponse adéquate; Ma préférence est différente de ce qui a déjà été répondu.
Comme d’autres l’ont dit, évitez de tirer le courant. Mes commandes préférées (soit en tant que root, soit avecsudo
):
Pour arrêter: halt
(pour Wheezy et avant, cette commande éteint également le système; pour Jessie, elle ne s’éteint pas, bien qu’il soit sécuritaire de débrancher la prise une fois terminé) halt -p
; shutdown now -h
ou simplementpoweroff
sont nécessaires pour Jessie ...
Redémarrer: reboot
Je préfère ces commandes car elles sont simples, faciles à retenir et évidentes ...
halt
ou poweroff
, comme ce ne sont que des alias shutdown -h now
avec des outils GNU, mais sur d’autres systèmes, vous éteindrez immédiatement votre système, tuant tous vos programmes et éventuellement corrompant votre système de fichiers. Ceci dit, vous pouvez l’utiliser sur un pi framboise avec la plupart des distributions Linux, mais si vous utilisez pi pour l’apprentissage, vous voudrez peut-être le faire "de la bonne façon".
halt
, poweroff
, reboot
Et shutdown
sont tous les liens symboliques à systemctl
(avec la commande originale a également adopté). Cela déclenche ensuite la cible SystemD appropriée: par exemple poweroff.target
. FWIW poweroff.target
déclenche un appel ACPI pour arrêter le système proprement. Donc, autant que je sache à l’époque actuelle poweroff
(ou systemctl poweroff
) EST «la bonne façon». :)
--no-preserve-root
drapeau. Ne comptez pas sur / bin / sh étant / bin / bash (ce n'est même plus vrai pour les systèmes basés sur Debian). Il est souvent utile d'essayer d'utiliser la "bonne" méthode, même si cela fonctionnerait actuellement d'une autre manière.
/bin/bash
. FYI, ma perspective est très centrée sur Debian ...
Pour vous lancer, si vous souhaitez ajouter un peu de matériel, vous pouvez écrire un petit démon pour interroger les broches GPIO et lors de l’affirmation d’une certaine broche, redémarrez (ou éteignez) le Pi.
En outre, toutes les commandes mentionnées ici peuvent être exécutées sur SSH.
Je sais que c'est 3 ans après la question initiale. Mais je viens de recevoir mon Raspberry Pi et je ne parviens pas à l'éteindre si j'ai oublié de le connecter à un écran et qu'il ne dispose pas d'une connexion réseau.
J'ai écrit un petit script Python pour l'éteindre automatiquement dans les 60 secondes en insérant une clé USB contenant un fichier nommé "pi_auto_shutdown".
Appelez ce script à partir de rc.local.
J'espère que ça aide.
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()
Je ssh dans ma boîte RPi en utilisant la commande
$ ssh rpi sudo poweroff
rpi est l'alias de l'adresse IP de ma boîte RPi et est défini dans le fichier ~ / .ssh / config .