헤드리스를 실행할 때 RPi를 종료하는 방법


33

Pi 헤드리스를 사용하는 경우 안전하게 종료하는 데 사용할 수있는 명령이 있습니까, 아니면 간단히 전원 코드를 제거해야합니까?


전원을
끄는

poweroff아마도 halt...에 대한 상징적 인 링크 일 것입니다 ! 8-)
SlySven

답변:


40

당신은 안전하게 파이를 종료 할 수 있습니다

shutdown -h now

-h는 모든 프로세스를 중지시킵니다.


7
-r이 재시작 (종료 + 재부팅)을 수행하는 것과 동시에 학습 할 가치가 있습니다.
XTL

6
루트로 종료하거나 sudo를 사용해야한다는 것을 잊지 마십시오.
keiki

1
대안sudo poweroff
berto

3
-h않습니다 중단 - 전체 시스템을 하지 않고 해당 옵션이 shutdown걸릴 것 init즉, 단일 사용자 모드, 슈퍼 사용자 로그인 (필요 루트 암호)를 기다리고 - 실행 레벨 1을. 루트로 로그인 한 다음 로그 아웃 init하면 RPi를 다중 사용자 모드로 가져 오는 데 필요한 작업을 다시 실행합니다. 원래 부팅시 (모든 작업이 완료된 후 (예 : fsck실행 /etc/rc.local중) 그런 다음). 이러한 맥락에서 "종료"는 "일반 사용자를 위해 시스템을 오프라인으로 전환"입니다.
SlySven

예. 그러나 shutdown실제로 실행하는 데 약간의 시간이 걸리며 ssh 클라이언트가 연결되어있는 동안 연결을 끊습니다. 예를 들어 SD 카드를 제거하는 것이 안전한시기를 어떻게 알 수 있습니까?
Tom Auger

40

때로는 코드 시스템의 플러그를 뽑지 마십시오. 파일 시스템이 손상 될 수 있습니다.

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. 여기에 언급 된 모든 명령에 대해서는 맨 페이지를 참조하십시오.


3
나는 이것이 OP가 요구 한 것이라고 생각하지 않습니다. 그러나 정보는 +1입니다.
Vincent P

산뜻한! 물론 임의의 USB 장치를 제거 (또는 연결)하여이를 트리거 할 수 있어야합니다.
Tobias Kienzler

좋은 시작입니다. GPIO 버튼 (ACPI 또는 HID 이벤트와 같은 방식으로 얻을 수있는 방법)에 의해 시스템 종료가 발생하는 것이 더 편리합니다.
XTL

@ XTL : 주위에 apci 데몬이 있으므로 가능합니다 (커널은 proc 등을 통해보고합니다). pi의 gpio의 경우에도 마찬가지입니다. HID 이벤트는 좀 더 맥락 적이며 (예를 들어 GUI 데스크탑 환경 인 컨텍스트) "halt"( shutdown -h now리눅스에서는 ==) 를 입력 할 수 있다는 사실 은 그러한 필요성을 완화시킬 수 있습니다.)
goldilocks

이것은 완벽합니다. 동글은 Pi에 연결되는 유일한 것이므로 연결이 끊기는 경우가 많으므로 전력 손실로 인해 손상되지 않고 이동해야합니다.
noio

8

다음 명령을 실행하여 종료 할 수 있습니다.

sudo init 0

그리고 재부팅하려면 :

sudo init 6

이는 운영 체제가 여전히 사용하는 개념 인 실행 수준에 따라 크게 달라집니다. systemd로 전환하면 오늘날에는 이것을 덜 사용할 수 있습니다.
Stephen Michael Kellat

오늘의 수정 사항을 제외하면 이것이 오래된 답변이라는 것을 알았을 것입니다. 이 문제는 2 살 이상입니다.
등록 된 사용자

1
이 사용법 sudo telinit #에서 #은 0과 6 사이의 숫자 인 것이 좋습니다. telinit는 기본 이름 "init"로 호출되지 않음을 인식하는 init에 대한 심볼릭 링크이며 PID가 없습니다. 1!) 따라서 실제 "init"프로세스에 대한 파이프를 작성 하고 현재 실행 레벨을 숫자 인수로 지정된 새 값 으로 변경하도록 지시합니다 . telinit"새로운 런레벨을 알리십시오"의 축소입니다.
SlySven 2019 년

7

내가 선호하는 방법은을 사용 sudo poweroff하는 것인데, 이는 전력 사용량을 죽이는 종료 명령의 별명입니다.


7

질문은 이미 적절하게 답변되었지만; 나의 선호는 이미 답변 된 것과 다릅니다.

다른 사람들이 말했듯이 그냥 힘을 당기지 마십시오. 내가 선호하는 명령 (루트 또는 앞에 추가 sudo) :

중지하려면 : halt(Wheezy 및 이전 버전의 경우이 명령으로 시스템의 전원도 꺼집니다. Jessie의 경우 일단 완료되면 플러그를 잡아 당기는 것이 안전하지만 실제로 전원을 끄지는 않습니다) halt -p; shutdown now -h또는 poweroffJessie에게는 단순히 필요합니다 ...

재부팅하려면 : reboot

나는이 명령들이 간단하고 기억하기 쉽고 자명하기 때문에 선호합니다


윙윙 거리는 것을 의미하지는 않지만 데비안 (예 : Raspbian의 상류)이 명령이 작동하는 방식을 변경했기 때문에 (8 개월 전) 내 답변이 다운 투트되었다는 것은 약간 거칠다고 생각합니다. . 또한 내 답변 (편집 이전)은 여전히 ​​OP에 대답했습니다 (즉, 시스템을 정지하면 플러그를 뽑는 것이 안전합니다 ...). FWIW 나는 답변을 업데이트하여 더 이상 사용자로 작동하지 않는 것이 분명합니다. 희망 ...
제레미 데이비스

당신은 습관을 사용하지해야 halt하거나 poweroff, 그들이 별칭에 전용으로 shutdown -h nowGNU 도구를 사용하지만, 다른 시스템에서 모든 프로그램을 죽이고 아마도 당신의 파일 시스템을 손상 즉시 시스템 전원이 꺼집니다. 이것은 대부분의 리눅스 배포판이있는 라즈베리 파이에서 사용할 수 있지만 학습에 파이를 사용하는 경우 "올바른 방법"을 원할 수 있습니다.
allo

@allo-레거시 Linux OS 및 기타 Linux와 같은 Linux 이외의 UNIX (예 : BSD) 변형에도 적합 할 수 있습니다. 그러나 SystemD를 사용하는 최신 Linux OS (즉, 요즘 대부분의 Linux)에서는 그렇지 않습니다. halt, poweroff, rebootshutdown모든 심볼릭 링크입니다 systemctl(또한 전달 된 원래의 명령은). 그런 다음 적절한 SystemD 대상을 트리거합니다. 예 : poweroff.target. FWIW poweroff.target는 ACPI 호출을 트리거하여 시스템을 완전히 종료합니다. 그래서이 시대에 AFAIK poweroff(또는 systemctl poweroff) "올바른 방법"입니다. :)
Jeremy Davis

리눅스를 사용하는 많은 경우와 마찬가지로 여러 가지 방법이 있습니다. 그러나 표준에 설명되어 있고 다른 유닉스 시스템이 뒤 따르는 방식을 배우고 싶지 않다면 고려해야합니다. 리눅스 사용자에게는 이점이 거의 없지만, 나중에 다른 시스템을 언제 시도 할 것인지 누가 알겠습니까? 정지에 의존하지 말고 --no-preserve-root깃발 을 가지고 rm에 의존하지 마십시오 . / bin / sh가 / bin / bash 인 것에 의존하지 마십시오 (데비안 기반 시스템에서는 더 이상 사실이 아닙니다). 현재 다른 방식으로 작동하더라도 "올바른"방법을 사용하는 것이 종종 유용합니다.
allo

1
@allo-공정한 포인트이며 다른 시스템에 대한 지식을 공유하는 것이 정말 훌륭하다고 생각합니다. 시스템과의 차이점과 관련 제한 사항에 주목할 가치가 있음에 동의합니다. 나는 당신의 길이 "올바른"길이라는 당신의 제안에 동의하지 않지만. "posix 호환"방식 일 수 있지만 한 가지 방법은 "올 바르고"다른 방법은 "틀리지 않습니다". bash (및 bashisms)를 사용하는 것은 완전히 합법적 인 IMO이지만 bash가 필요하거나 원하지 않으면 명시 적으로 사용해야한다는 데 동의합니다 /bin/bash. 참고로 나의 관점은 ... 매우 데비안 중심입니다
제레미 데이비스

4

하드웨어를 추가하는 경우 GPIO 핀을 폴링하고 특정 핀을 주장 할 때 Pi를 재부팅 (또는 종료)하기 위해 작은 데몬을 작성할 수 있습니다.

또한 여기에 언급 된 모든 명령은 SSH를 통해 실행될 수 있습니다.


3

원래 질문 이후 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()

재미있는 접근법.
Eric Wilson

1

나는 ssh를 명령을 사용하여 내 RPI 상자에

$ ssh rpi sudo 전원 끄기

rpi 는 내 RPi 상자의 IP 주소에 대한 별칭이며 ~ / .ssh / config 파일에 정의되어 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.