Como desligar o RPi ao executar sem cabeça


33

Se eu estiver executando um Pi sem cabeça, existe um comando que eu possa usar para desligar com segurança ou devo simplesmente remover o cabo de alimentação?


poweroff é a melhor maneira de desligá-lo
Rahulan

poweroffé provavelmente um link simbólico para halt...! 8-)
SlySven

Respostas:


40

Você pode desligar o pi com segurança usando

shutdown -h now

O -h apenas interrompe todos os processos


7
Pode valer a pena aprender ao mesmo tempo que -r fará uma reinicialização (desligamento + reinicialização).
XTL

6
Não se esqueça de que você deve estar root para desligar ou usar o sudo.
keiki

1
Como alternativasudo poweroff
berto

3
O -hfaz parar todo o sistema - sem essa opção shutdownterá initde executar no nível 1 - ou seja, o modo de usuário único, à espera de um login super-usuário (root password necessário). Após o login como root e inito logoff, refaz-se o material necessário para ativar o RPi no modo multiusuário - como faria durante a inicialização original (após a conclusão de todo o material, ou seja fsck, etc, executando /etc/rc.local-o) faz então). Neste contexto, "shutdown" é "levar o sistema off-line para usuários normais" ...
SlySven

Sim, mas shutdownna verdade leva algum tempo para ser executado e desconecta todos os clientes ssh enquanto isso acontece. Então, como você sabe quando é seguro remover, por exemplo, o cartão SD?
Tom Auger

40

Não basta desconectar o cabo, pois isso pode ocasionalmente (talvez, com freqüência) levar à corrupção do sistema de arquivos.

Como Impluss diz, use shutdown. Recentemente, deparei com uma dica sobre como configurar o udev para acionar o desligamento ou a reinicialização quando um dispositivo USB específico é desconectado. Isso é útil se o sistema não responder ou perder uma conexão de rede e você não puder ou não se importar em conectar coisas ocultas (dispositivo de interface humana) como um teclado a ele.

Existe uma boa introdução, talvez um pouco desatualizada, mas bem escrita, às regras do udev | aqui | . A idéia básica é obter algumas informações sobre o dispositivo vialsusb , por exemplo:

Bus 002 Device 003: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN

O terceiro campo rotulado ID é o fornecedor e o modelo, separados por dois pontos. Presumindo que você não tenha vários dispositivos idênticos conectados, essa combinação deve ser única.

Você pode obter informações relevantes mais detalhadas por meio de udevadm monitor --udev --property, que se reportará ao padrão até que você as mate, por exemplo. quando eu desconecto o dongle wifi teenie weenie de cima, ele cospe:

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 os campos ID_MODEL e ID_VENDOR. É isso que você deseja usar na sua regra do udev. Existem algumas fontes desatualizadas ou incorretas online que sugerem o uso de campos ATTR, mas esses são campos ENV com relação a um evento "remover".

Crie um arquivo no /etc/udev/rules.d. É o mesmo, independentemente da distribuição. O arquivo deve terminar .rulese todos os arquivos neste diretório são processados ​​lexicograficamente. Acredito que as regras declaradas anteriormente tenham precedência, portanto, o uso 00-my_pi.rulesa manterá na frente da linha (os números são classificados antes das letras). Nele, adicione uma linha como:

ACTION=="remove", ENV{ID_VENDOR_ID}=="0bda", ENV{ID_MODEL_ID}=="8176", RUN+="/sbin/shutdown -h now"

Cuidado ==e não =. Se você usar o posterior, o critério não terá sentido. Nesse caso, você pode acabar com uma regra do udev que corresponde a qualquer evento!

Verifique se isso está carregado udevadm control --reload-rules. Agora, quando você puxa o dongle do Wi-Fi, o pi deve ser desligado corretamente ... reserve um minuto para fazer isso e você poderá desconectar a energia (tente isso com uma tela conectada pela primeira vez). Você também pode usar isso para reiniciar - consulte man shutdowne, na verdade, a página de manual de todos os comandos mencionados aqui;)


3
Eu não acho que isso é o que o OP estava perguntando. Mas +1 para a informação.
Vincent P

Arrumado! Você deve, naturalmente, também ser capaz de ter a remoção (ou ligar) de um gatilho dispositivo USB arbitrária este
Tobias KIENZLER

Este é um bom começo. Obter o desligamento acionado por um botão GPIO (qualquer maneira de obter algo assim para o evento ACPI ou HID?) Ou algo seria ainda mais útil.
XTL

@XTL: Existem daemons apci por aí, então é possível (o kernel reporta via proc, etc). O mesmo é pelo menos potencialmente verdadeiro para gpio no pi. Eventos HID são mais contextual (um contexto exemplo ser um ambiente de desktop GUI) eo fato de que você pode digitar "parada" (== shutdown -h nowno Linux) talvez mitiga a necessidade de tal;)
goldilocks

Isso é perfeito, o dongle é a única coisa conectada ao nosso Pi, e geralmente perdemos a conexão, então precisamos movê-lo, sem danificá-lo devido à perda de energia.
Noio

8

Você pode emitir o seguinte comando para desligar:

sudo init 0

E para reiniciar:

sudo init 6

Isso depende muito dos níveis de execução serem um conceito que o sistema operacional ainda usa. Uma mudança para o systemd torna isso menos utilizável atualmente.
Stephen Michael Kellat

Excluindo a edição de hoje, você deve ter notado que essa é uma resposta bastante antiga. A questão também tem mais de dois anos.
Usuário registrado

1
Nesse uso, é considerado melhor usar sudo telinit #onde # é um número entre 0 e 6 - telinit é um link simbólico para o init que reconhece que não está sendo chamado pelo nome primário "init" (e que não possui um PID de 1!) Para criar um canal para o processo "init" real e solicitar que altere o nível de execução atual para o novo valor indicado como argumento numérico . telinité uma contração de "tell init the new runlevel".
precisa saber é o seguinte

7

Meu método preferido é usar sudo poweroff, que é um alias para um comando de desligamento que também mata o uso de energia.


7

Enquanto a pergunta já foi respondida adequadamente; minha preferência é diferente do que já foi respondido.

Como outros já disseram, evite apenas puxar o poder. Meus comandos preferidos (como root ou preceder comsudo ):

Para interromper: halt(para Wheezy e anterior, este comando também desliga o sistema; para Jessie, na verdade, ele não é desligado, embora seja seguro puxar o plugue assim que terminar) halt -p; shutdown now -hou simplesmentepoweroff são necessários para Jessie ...

Para reiniciar: reboot

Prefiro esses comandos, pois são diretos, fáceis de lembrar e evidentes ...


Não quero me queixar, mas acho que é um pouco severo que minha resposta (de 8 meses atrás) tenha sido votada porque o Debian (ou seja, a montante do Raspbian) mudou a maneira como seus comandos funcionam (assumindo que é por isso que eu fui votado) . Além disso, minha resposta (antes da edição) ainda respondeu ao OP (ou seja, se você interromper o sistema, é seguro puxar o plugue ...) FWIW Atualizei a resposta para que fique claro que isso não funciona mais como o usuário pode esperança ...
Jeremy Davis

Você não deve adquirir o hábito de usar haltou poweroff, como eles são apenas aliases das shutdown -h nowferramentas GNU, mas em outros sistemas você desligará o sistema imediatamente, matando todos os seus programas e possivelmente corrompendo seu sistema de arquivos. Dito isto, você pode usá-lo em um raspberry pi com a maioria das distribuições linux, mas se você usar o pi para aprender, poderá fazê-lo "da maneira certa".
allo

@allo - Você pode estar correto também para o sistema operacional Linux herdado e outras variantes de sistemas operacionais Unix não Linux, como o OS (por exemplo, BSD). Mas nos sistemas operacionais Linux mais recentes que usam o SystemD (ou seja, a maioria dos Linux atualmente), esse não é o caso. halt, poweroff, rebootE shutdownsão todos links simbólicos para systemctl(com o comando original também passou). Isso então aciona o alvo SystemD apropriado: por exemplo poweroff.target. O FWIW poweroff.targetaciona uma chamada ACPI para desligar o sistema corretamente. Portanto, o AFAIK hoje em dia poweroff(ou systemctl poweroff) é "o caminho certo". :)
Jeremy Davis

Como em muitos casos com o linux, há mais de uma maneira de fazer isso. Mas você deve considerar se não deseja aprender da maneira que é descrita no padrão, seguida por outros sistemas unix também. Há pouco benefício para você como usuário do Linux, mas quem sabe quando você tentará outro sistema no futuro? não confie na parada e não confie na rm para ter uma --no-preserve-rootbandeira. Não confie em / bin / sh being / bin / bash (isso nem é mais verdade para sistemas baseados em debian). Muitas vezes, é útil tentar usar o caminho "certo", mesmo que atualmente funcione de outra maneira.
allo

1
@allo - Pontos justos e acho realmente incrível compartilhar seu conhecimento sobre diferentes sistemas e concordo que certamente vale a pena observar as diferenças entre os sistemas e as limitações relevantes. Embora eu discorde de sua sugestão de que seu caminho é o caminho "certo". Pode ser o caminho "compatível com posix", mas não faz um caminho "certo" e outro "errado". Por exemplo, o uso do bash (e bashisms) é IMO totalmente legítimo, embora eu concorde que se você precisar / quiser do bash, use explicitamente /bin/bash. Para sua informação, minha perspectiva é muito centrada no Debian ...
Jeremy Davis

4

Apenas para inseri-lo, se você quiser adicionar um pouco de hardware, pode escrever um pequeno daemon para pesquisar os pinos do GPIO e após a afirmação de um determinado pino, reiniciar (ou desligar) o Pi.

Além disso, todos os comandos mencionados aqui podem ser executados no SSH.


3

Eu sei que são 3 anos após a pergunta original. Mas acabei de adquirir o meu Raspberry Pi e estou tendo problemas para desligá-lo se me esquecer de conectá-lo a uma tela de monitor e ele não tiver nenhuma conexão de rede.

Eu escrevi um pequeno script Python para desligá-lo automaticamente em 60 segundos, conectando um pendrive que contém o arquivo chamado "pi_auto_shutdown".

Basta chamar esse script em rc.local.

Eu espero que isso ajude.

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

Abordagem interessante.
Eric Wilson

1

Eu ssh na minha caixa RPi usando o comando

$ ssh rpi powerdo sudo

rpi é o alias do endereço IP da minha caixa RPi e é definido no arquivo ~ / .ssh / config .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.