Cómo cerrar RPi cuando se ejecuta sin cabeza


33

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?


el apagado es la mejor manera de apagarlo
RahulAN

poweroffes probablemente un enlace simbólico a halt...! 8-)
SlySven

Respuestas:


40

Puede apagar el pi de forma segura utilizando

shutdown -h now

El -h simplemente detiene todos los procesos


77
Puede valer la pena aprender al mismo tiempo que -r hará un reinicio (apagado + reinicio).
XTL

66
No olvides que debes ser root para apagar o usar sudo.
keiki

1
Alternativamentesudo poweroff
berto

3
La -hhace detener todo el sistema - sin esa opción shutdownse llevará inital 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 initluego 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, fscketc, corriendo /etc/rc.localque hace entonces). En este contexto, "apagado" es "desconectar el sistema para usuarios normales" ...
SlySven

Sí, pero en shutdownrealidad 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?
Tom Auger

40

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 .rulesy 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.ruleslo 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 shutdowny, en realidad, la página del manual para todos los comandos mencionados aquí;)


3
No creo que esto sea lo que preguntaba el OP. Pero +1 para la información.
Vincent P

¡Ordenado! Por supuesto, también debería poder hacer que la extracción (o la conexión) de un dispositivo USB arbitrario desencadene esto
Tobias Kienzler

Este es un buen comienzo. Hacer que el apagado se active mediante un botón GPIO (¿alguna forma de llevar algo así a un evento ACPI o HID?) O algo sería aún más útil.
XTL

@XTL: hay demonios apci alrededor, por lo que es posible (el núcleo informa a través de proc, etc.). Lo mismo es al menos potencialmente cierto para gpio en pi. Los eventos HID son más contextuales (un contexto de ejemplo es un entorno de escritorio GUI) y el hecho de que puede escribir "detener" (== shutdown -h nowen Linux) puede mitigar la necesidad de tales;)
Ricitos de Oro

Esto es perfecto, el dongle es lo único que está conectado a nuestro Pi, y a menudo perdemos la conexión, por lo que debemos moverlo, sin corromperlo por la pérdida de energía.
noio

8

Puede emitir el siguiente comando para apagar:

sudo init 0

Y para reiniciar:

sudo init 6

Esto depende en gran medida de que los niveles de ejecución sean un concepto que el sistema operativo aún utiliza. Un cambio a systemd hace que esto sea menos utilizable hoy en día.
Stephen Michael Kellat

Excluyendo la edición de hoy, es posible que haya notado que esta es una respuesta bastante antigua. La pregunta también tiene más de dos años.
Usuario registrado

1
En este uso, se considera mejor usar 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 . telinites una contracción de "tell init the new runlevel".
SlySven

7

Mi método preferido es usar sudo poweroff, que es un alias para un comando de apagado que también mata el uso de energía.


7

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 -ho simplemente poweroffson necesarios para Jessie ...

Reiniciar: reboot

Prefiero estos comandos, ya que son sencillos, fáciles de recordar y evidentes ...


No pretendo quejarme, pero creo que es un poco duro que mi respuesta (de hace 8 meses) haya sido rechazada porque Debian (es decir, aguas arriba de Raspbian) cambió la forma en que funcionan sus comandos (suponiendo que por eso me rechazaron) . También mi respuesta (antes de la edición) todavía respondía al OP (es decir, si detiene el sistema, es seguro desconectarlo ...) FWIW He actualizado la respuesta, por lo que está claro que esto ya no funciona como un usuario podría esperanza ...
Jeremy Davis

No debería recibir el hábito de usar halto poweroff, ya que sólo son alias para shutdown -h nowcon 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".
allo

@allo: puede ser correcto para el sistema operativo Linux heredado y otras variantes de sistemas operativos que no sean Linux Unix (por ejemplo, BSD) también. Pero en sistemas operativos Linux más recientes que usan SystemD (es decir, la mayoría de Linux en estos días) ese no es el caso. halt, poweroff, rebootY shutdownson 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.targetactiva 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". :)
Jeremy Davis el

Como en muchos casos con Linux, hay más de una forma de hacerlo. Pero debe considerar si no desea aprenderlo de la manera que se describe en el estándar, que también es seguido por otros sistemas Unix. Como usuario de Linux, tiene pocos beneficios, pero ¿quién sabe cuándo probará algún otro sistema en el futuro? no confíe en detener y no confíe en rm para tener una --no-preserve-rootbandera. 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.
allo

1
@allo: puntos justos y creo que es realmente increíble para usted compartir su conocimiento de los diferentes sistemas y estoy de acuerdo en que vale la pena señalar las diferencias entre los sistemas y las limitaciones relevantes. Aunque no estoy de acuerdo con su sugerencia de que su camino es el "correcto". Puede ser la forma "compatible con posix", pero no hace que una forma sea "correcta" y otra "incorrecta". Por ejemplo, usar bash (y bashisms) es una OMI totalmente legítima, aunque estoy de acuerdo en que si necesitas / quieres bash, entonces debes usarlo explícitamente /bin/bash. FYI mi perspectiva es muy centrada en Debian ...
Jeremy Davis

4

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.


3

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()

Enfoque interesante
Eric Wilson

1

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 .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.