답변:
당신은 안전하게 파이를 종료 할 수 있습니다
shutdown -h now
-h는 모든 프로세스를 중지시킵니다.
sudo poweroff
-h
않습니다 중단 - 전체 시스템을 하지 않고 해당 옵션이 shutdown
걸릴 것 init
즉, 단일 사용자 모드, 슈퍼 사용자 로그인 (필요 루트 암호)를 기다리고 - 실행 레벨 1을. 루트로 로그인 한 다음 로그 아웃 init
하면 RPi를 다중 사용자 모드로 가져 오는 데 필요한 작업을 다시 실행합니다. 원래 부팅시 (모든 작업이 완료된 후 (예 : fsck
실행 /etc/rc.local
중) 그런 다음). 이러한 맥락에서 "종료"는 "일반 사용자를 위해 시스템을 오프라인으로 전환"입니다.
shutdown
실제로 실행하는 데 약간의 시간이 걸리며 ssh 클라이언트가 연결되어있는 동안 연결을 끊습니다. 예를 들어 SD 카드를 제거하는 것이 안전한시기를 어떻게 알 수 있습니까?
때로는 코드 시스템의 플러그를 뽑지 마십시오. 파일 시스템이 손상 될 수 있습니다.
Impluss가 말했듯이을 사용하십시오 shutdown
. 최근에 특정 USB 장치를 뽑을 때 종료 또는 재부팅을 트리거하도록 udev를 구성하는 방법에 대한 팁을 보았습니다. 이것은 시스템이 응답하지 않거나 네트워크 연결이 끊어 졌거나 키보드와 같이 숨겨진 (휴먼 인터페이스 장치) 항목을 연결하는 데 방해가되지 않는 경우에 유용합니다.
udev 규칙에 대한 좋은, 아마도 약간 오래된 글이지만 잘 쓰여진 소개가 있습니다. | here | . 기본 아이디어는 다음을 통해 장치에 대한 정보를 얻는 것입니다 lsusb
.
Bus 002 Device 003: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN
ID 라고 표시된 세 번째 필드 는 콜론으로 구분 된 공급 업체 및 모델 ID입니다. 동일한 장치가 여러 개 연결되어 있지 않다고 가정하면이 조합은 고유해야합니다.
를 통해보다 자세한 관련 정보를 얻을 수 있습니다 udevadm monitor --udev --property
. 예를 들어 죽일 때까지 표준으로보고합니다. 내가 teenie weenie wifi 동글의 플러그를 뽑을 때
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
ID_MODEL 및 ID_VENDOR 필드를 확인하십시오. 이것들은 udev 규칙에서 사용하고자하는 것입니다. 온라인에 ATTR 필드 사용을 제안하는 오래되거나 올바르지 않은 소스가 있지만 "제거"이벤트와 관련된 ENV 필드입니다.
에 파일을 만듭니다 /etc/udev/rules.d
. 이것은 배포에 관계없이 동일합니다. 파일은 끝나야 .rules
하며이 디렉토리의 모든 파일은 사전 식으로 처리됩니다. 이전에 선언 된 규칙이 우선한다고 생각하므로를 사용 00-my_pi.rules
하면 규칙 이 맨 앞에 표시됩니다 (문자 앞에 숫자 정렬). 그것에 다음과 같은 줄을 추가하십시오 :
ACTION=="remove", ENV{ID_VENDOR_ID}=="0bda", ENV{ID_MODEL_ID}=="8176", RUN+="/sbin/shutdown -h now"
조심 ==
하지 =
. 나중에 사용하면 기준이 의미가 없습니다. 어떤 경우에도 모든 이벤트와 일치하는 udev 규칙으로 끝날 수 있습니다!
이로로드되어 있는지 확인하십시오 udevadm control --reload-rules
. 이제 wifi 동글이 빠져 나올 때 pi가 완전히 종료되어야합니다. 분 동안 전원을 공급 한 다음 전원을 뽑을 수 있습니다 (처음으로 스크린을 연결하여 시도). 이것을 사용하여 다시 부팅 할 수도 있습니다 man shutdown
. 여기에 언급 된 모든 명령에 대해서는 맨 페이지를 참조하십시오.
shutdown -h now
리눅스에서는 ==) 를 입력 할 수 있다는 사실 은 그러한 필요성을 완화시킬 수 있습니다.)
다음 명령을 실행하여 종료 할 수 있습니다.
sudo init 0
그리고 재부팅하려면 :
sudo init 6
sudo telinit #
에서 #은 0과 6 사이의 숫자 인 것이 좋습니다. telinit는 기본 이름 "init"로 호출되지 않음을 인식하는 init에 대한 심볼릭 링크이며 PID가 없습니다. 1!) 따라서 실제 "init"프로세스에 대한 파이프를 작성 하고 현재 실행 레벨을 숫자 인수로 지정된 새 값 으로 변경하도록 지시합니다 . telinit
"새로운 런레벨을 알리십시오"의 축소입니다.
질문은 이미 적절하게 답변되었지만; 나의 선호는 이미 답변 된 것과 다릅니다.
다른 사람들이 말했듯이 그냥 힘을 당기지 마십시오. 내가 선호하는 명령 (루트 또는 앞에 추가 sudo
) :
중지하려면 : halt
(Wheezy 및 이전 버전의 경우이 명령으로 시스템의 전원도 꺼집니다. Jessie의 경우 일단 완료되면 플러그를 잡아 당기는 것이 안전하지만 실제로 전원을 끄지는 않습니다) halt -p
; shutdown now -h
또는 poweroff
Jessie에게는 단순히 필요합니다 ...
재부팅하려면 : reboot
나는이 명령들이 간단하고 기억하기 쉽고 자명하기 때문에 선호합니다
halt
하거나 poweroff
, 그들이 별칭에 전용으로 shutdown -h now
GNU 도구를 사용하지만, 다른 시스템에서 모든 프로그램을 죽이고 아마도 당신의 파일 시스템을 손상 즉시 시스템 전원이 꺼집니다. 이것은 대부분의 리눅스 배포판이있는 라즈베리 파이에서 사용할 수 있지만 학습에 파이를 사용하는 경우 "올바른 방법"을 원할 수 있습니다.
halt
, poweroff
, reboot
및 shutdown
모든 심볼릭 링크입니다 systemctl
(또한 전달 된 원래의 명령은). 그런 다음 적절한 SystemD 대상을 트리거합니다. 예 : poweroff.target
. FWIW poweroff.target
는 ACPI 호출을 트리거하여 시스템을 완전히 종료합니다. 그래서이 시대에 AFAIK poweroff
(또는 systemctl poweroff
) "올바른 방법"입니다. :)
--no-preserve-root
깃발 을 가지고 rm에 의존하지 마십시오 . / bin / sh가 / bin / bash 인 것에 의존하지 마십시오 (데비안 기반 시스템에서는 더 이상 사실이 아닙니다). 현재 다른 방식으로 작동하더라도 "올바른"방법을 사용하는 것이 종종 유용합니다.
/bin/bash
. 참고로 나의 관점은 ... 매우 데비안 중심입니다
원래 질문 이후 3 년이 지났다는 것을 알고 있습니다. 그러나 방금 Raspberry Pi를 얻었고 모니터 화면에 연결하는 것을 잊어 네트워크 연결이 없으면 종료하는 데 문제가 있습니다.
"pi_auto_shutdown"이라는 파일이 포함 된 thumbdrive를 연결하여 60 초 이내에 자동으로 종료되도록 작은 Python 스크립트를 작성했습니다.
rc.local에서이 스크립트를 호출하십시오.
이게 도움이 되길 바란다.
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()