Si estoy ejecutando un Pi sin cabeza, ¿hay algún comando que pueda usar para apagarlo de manera segura, o simplemente debo quitar el cable de alimentación?
poweroff
es probablemente un enlace simbólico a halt
...! 8-)
Si estoy ejecutando un Pi sin cabeza, ¿hay algún comando que pueda usar para apagarlo de manera segura, o simplemente debo quitar el cable de alimentación?
poweroff
es probablemente un enlace simbólico a halt
...! 8-)
Respuestas:
Puede apagar el pi de forma segura utilizando
shutdown -h now
El -h simplemente detiene todos los procesos
sudo poweroff
-h
hace detener todo el sistema - sin esa opción shutdown
se llevará init
al nivel de ejecución 1 - es decir, el modo de usuario único, a la espera de un inicio de sesión de superusuario (contraseña de root es necesario). Después de iniciar sesión como root y luego cerrar la sesión init
luego hacer de nuevo el material necesario para llevar el RPI en modo multiusuario - como lo haría en el original de arranque (después de la finalización de todas las cosas, es decir, fsck
etc, corriendo /etc/rc.local
que hace entonces). En este contexto, "apagado" es "desconectar el sistema para usuarios normales" ...
shutdown
realidad tarda un tiempo en ejecutarse y desconecta cualquier cliente ssh mientras está en funcionamiento. Entonces, ¿cómo saber cuándo es seguro, por ejemplo, quitar la tarjeta SD?
No desconecte simplemente el cable, ya que esto podría ocasionalmente (tal vez, a menudo) conducir a la corrupción del sistema de archivos.
Como dice Impluss, úsalo shutdown
. Recientemente me encontré con un consejo sobre la configuración de udev para activar el apagado o el reinicio cuando un dispositivo USB específico está desconectado. Esto es útil si el sistema no responde o ha perdido una conexión de red y no puede o no se molestará en enchufar cosas ocultas (dispositivos de interfaz humana) como un teclado.
Hay una buena introducción, quizás un poco desactualizada pero bien escrita, a las reglas de udev | aquí | . La idea básica es obtener información sobre el dispositivo a través de lsusb
, por ejemplo:
Bus 002 Device 003: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN
El tercer campo etiquetado como ID es el proveedor y la identificación del modelo separados por dos puntos. Suponiendo que no tiene varios dispositivos idénticos conectados, esta combinación debería ser única.
Puede obtener información relevante más detallada a través de udevadm monitor --udev --property
, que informará a la norma hasta que la mate, por ejemplo. cuando desconecto el dongle wifi teenie weenie desde arriba escupe:
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
Observe los campos ID_MODEL e ID_VENDOR. Estos son los que desea usar en su regla de udev. Hay algunas fuentes desactualizadas o incorrectas en línea que sugieren utilizar campos ATTR, pero estos son campos ENV con respecto a un evento "eliminar".
Crea un archivo en /etc/udev/rules.d
. Esto es lo mismo independientemente de la distribución. El archivo debe terminar .rules
y todos los archivos en este directorio se procesan lexicográficamente. Creo que las reglas declaradas anteriormente tienen prioridad, por lo que el uso 00-my_pi.rules
lo mantendrá al frente de la línea (los números se ordenan antes que las letras). En él agregue una línea como:
ACTION=="remove", ENV{ID_VENDOR_ID}=="0bda", ENV{ID_MODEL_ID}=="8176", RUN+="/sbin/shutdown -h now"
Cuidado ==
y no =
. Si usa el último, el criterio no tiene sentido. En cuyo caso, podría terminar con una regla udev que coincida con cualquier evento.
Asegúrese de que esté cargado con udevadm control --reload-rules
. Ahora, cuando desconecte el dispositivo de seguridad wifi, el pi debería apagarse limpiamente ... déle un minuto para hacerlo y luego puede desconectar la alimentación (intente esto con una pantalla conectada la primera vez). También puede usar esto para reiniciar: vea man shutdown
y, en realidad, la página del manual para todos los comandos mencionados aquí;)
shutdown -h now
en Linux) puede mitigar la necesidad de tales;)
Puede emitir el siguiente comando para apagar:
sudo init 0
Y para reiniciar:
sudo init 6
sudo telinit #
donde # es un número entre 0 y 6: telinit es un enlace simbólico a init que reconoce que no se llama por su nombre principal "init" (y que no tiene un PID de 1!) Por lo que crea una canalización al proceso "init" real y le dice que cambie el nivel de ejecución actual al nuevo valor establecido como argumento numérico . telinit
es una contracción de "tell init the new runlevel".
Si bien la pregunta ya ha sido respondida adecuadamente; mi preferencia es diferente a lo que ya ha sido respondido.
Como otros han dicho, evite simplemente tirar del poder. Mis comandos preferidos (ya sea como root o antepuestos sudo
):
Para detener: halt
(para Wheezy y antes, este comando también apaga el sistema; para Jessie en realidad no se apaga, aunque es seguro desconectarlo una vez finalizado) halt -p
; shutdown now -h
o simplemente poweroff
son necesarios para Jessie ...
Reiniciar: reboot
Prefiero estos comandos, ya que son sencillos, fáciles de recordar y evidentes ...
halt
o poweroff
, ya que sólo son alias para shutdown -h now
con las herramientas GNU, pero en otros sistemas que se apague el sistema inmediatamente, matando a todos sus programas y, posiblemente, corrompiendo su sistema de archivos. Dicho esto, puede usarlo en una frambuesa pi con la mayoría de las distribuciones de Linux, pero si usa la pi para aprender, es posible que desee hacerlo "de la manera correcta".
halt
, poweroff
, reboot
Y shutdown
son todos los enlaces simbólicos a systemctl
(con el comando original también pasado). Eso entonces dispara el objetivo apropiado de SystemD: por ejemplo poweroff.target
. FWIW poweroff.target
activa una llamada ACPI para apagar el sistema limpiamente. Así que AFAIK en este día y edad poweroff
(o systemctl poweroff
) ES "la forma correcta". :)
--no-preserve-root
bandera. No confíe en / bin / sh como / bin / bash (esto ya ni siquiera es cierto para los sistemas basados en Debian). A menudo es útil tratar de usar la forma "correcta", incluso si actualmente funcionara de otra manera.
/bin/bash
. FYI mi perspectiva es muy centrada en Debian ...
Solo para agregarlo, si desea agregar un poco de hardware, puede escribir un pequeño demonio para sondear los pines GPIO y, al afirmar un cierto pin, reinicie (o apague) el Pi.
Además, todos los comandos mencionados aquí se pueden ejecutar sobre SSH.
Sé que son 3 años después de la pregunta original. Pero acabo de recibir mi Raspberry Pi y tengo problemas para apagarlo si olvidé conectarlo a una pantalla de monitor y no tiene ninguna conexión de red.
Escribí un pequeño script de Python para apagarlo automáticamente en 60 segundos conectando una unidad de disco que contiene el archivo llamado "pi_auto_shutdown".
Simplemente llame a este script desde rc.local.
Espero que esto ayude.
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()
Me ssh en mi cuadro de RP _ usando el comando
$ ssh rpi sudo apagado
rpi es el alias de la dirección IP de mi cuadro RPi y se define en el archivo ~ / .ssh / config .