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
é provavelmente um link simbólico para halt
...! 8-)
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
é provavelmente um link simbólico para halt
...! 8-)
Respostas:
Você pode desligar o pi com segurança usando
shutdown -h now
O -h apenas interrompe todos os processos
sudo poweroff
-h
faz parar todo o sistema - sem essa opção shutdown
terá init
de 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 init
o 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" ...
shutdown
na 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?
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 .rules
e 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.rules
a 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 shutdown
e, na verdade, a página de manual de todos os comandos mencionados aqui;)
shutdown -h now
no Linux) talvez mitiga a necessidade de tal;)
Você pode emitir o seguinte comando para desligar:
sudo init 0
E para reiniciar:
sudo init 6
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".
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 -h
ou simplesmentepoweroff
são necessários para Jessie ...
Para reiniciar: reboot
Prefiro esses comandos, pois são diretos, fáceis de lembrar e evidentes ...
halt
ou poweroff
, como eles são apenas aliases das shutdown -h now
ferramentas 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".
halt
, poweroff
, reboot
E shutdown
sã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.target
aciona uma chamada ACPI para desligar o sistema corretamente. Portanto, o AFAIK hoje em dia poweroff
(ou systemctl poweroff
) é "o caminho certo". :)
--no-preserve-root
bandeira. 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.
/bin/bash
. Para sua informação, minha perspectiva é muito centrada no Debian ...
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.
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()
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 .