Cách tắt RPi khi chạy không đầu


33

Nếu tôi đang chạy Pi không đầu, có lệnh nào tôi có thể sử dụng để tắt an toàn không, hay tôi chỉ nên tháo dây nguồn?


poweroff là cách tốt nhất để tắt nó
RahulAN

poweroffcó lẽ là một liên kết tượng trưng đến halt...! 8-)
SlySven

Câu trả lời:


40

Bạn có thể tắt pi một cách an toàn bằng cách sử dụng

shutdown -h now

-H chỉ dừng lại tất cả các quy trình


7
Có thể đáng để học cùng lúc rằng -r sẽ thực hiện khởi động lại (tắt máy + khởi động lại).
XtL

6
Đừng quên bạn phải root để tắt hoặc sử dụng sudo.
keiki

1
Ngoài rasudo poweroff
berto

3
Các -hkhông ngừng toàn bộ hệ thống - mà không cần tùy chọn đó shutdownsẽ mất initđể chạy cấp 1 - tức là, chế độ người dùng đơn, chờ đợi một tên đăng nhập của siêu người dùng (root password cần thiết). Sau khi đăng nhập với quyền root và sau đó đăng xuất, initsau đó sẽ làm lại những thứ cần thiết để đưa RPi lên ở chế độ nhiều người dùng - giống như trong quá trình khởi động ban đầu (sau khi hoàn thành tất cả mọi thứ, fsckv.v., chạy /etc/rc.localnó sau đó). Trong bối cảnh này, "tắt máy" là "tắt hệ thống cho người dùng bình thường" ...
SlySven

Có, nhưng shutdownthực sự phải mất một thời gian để thực thi và ngắt kết nối bất kỳ ứng dụng khách ssh nào trong khi đó. Vậy làm thế nào để bạn biết khi nào an toàn, ví dụ, tháo thẻ SD?
Tom Auger

40

Không chỉ đơn giản rút dây, vì điều này đôi khi (có thể, thường xuyên) dẫn đến tham nhũng hệ thống tập tin.

Như Impluss nói, sử dụng shutdown. Gần đây tôi đã xem qua một mẹo về cách định cấu hình udev để kích hoạt tắt máy hoặc khởi động lại khi rút một thiết bị usb cụ thể. Điều này rất hữu ích nếu hệ thống trở nên không phản hồi hoặc mất kết nối mạng và bạn không thể hoặc không bận tâm đến việc cắm các công cụ ẩn (thiết bị giao diện người) như bàn phím vào nó.

Có một phần tốt, có lẽ hơi lỗi thời nhưng được viết tốt, giới thiệu về các quy tắc udev | tại đây | . Ý tưởng cơ bản là bạn có được một số thông tin về thiết bị thông qua lsusb, ví dụ:

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

Trường có nhãn thứ ba ID là nhà cung cấp và id mô hình được phân tách bằng dấu hai chấm. Giả sử bạn không cắm nhiều thiết bị giống hệt nhau, sự kết hợp này phải là duy nhất.

Bạn có thể nhận được thông tin chi tiết có liên quan thông qua udevadm monitor --udev --property, nó sẽ báo cáo tiêu chuẩn cho đến khi bạn giết nó, ví dụ. Khi tôi rút phích cắm wifi của teenie weenie từ phía trên, nó sẽ phun ra:

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

Lưu ý các trường ID_MODEL và ID_VENDOR. Đây là những gì bạn muốn sử dụng trong quy tắc udev của bạn. Có một số nguồn lỗi thời hoặc không chính xác trực tuyến đề xuất sử dụng các trường ATTR, nhưng đây là các trường ENV liên quan đến sự kiện "xóa".

Tạo một tập tin trong /etc/udev/rules.d. Điều này là giống nhau bất kể phân phối. Tệp phải kết thúc .rulesvà tất cả các tệp trong thư mục này được xử lý theo từ vựng. Tôi tin rằng các quy tắc được tuyên bố trước đó được ưu tiên, vì vậy việc sử dụng 00-my_pi.rulessẽ giữ nó ở phía trước của dòng (số sắp xếp trước các chữ cái). Trong đó thêm một dòng như:

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

Coi chừng ==và không =. Nếu bạn sử dụng sau này, các tiêu chí là vô nghĩa. Trong trường hợp bạn có thể kết thúc với một quy tắc udev phù hợp với bất kỳ sự kiện nào!

Hãy chắc chắn rằng điều này được tải với udevadm control --reload-rules. Bây giờ khi bạn rút dây wifi ra, pi nên tắt máy một cách sạch sẽ ... hãy chờ một phút để làm điều đó và sau đó bạn có thể rút nguồn điện (thử điều này với màn hình được gắn lần đầu tiên). Bạn cũng có thể sử dụng điều này để khởi động lại - xem man shutdown, và trên thực tế, trang man cho tất cả các lệnh được đề cập ở đây;)


3
Tôi không nghĩ đây là những gì OP yêu cầu. Nhưng +1 cho thông tin.
Vincent P

Khéo léo! Tất nhiên, bạn cũng có thể loại bỏ (hoặc cắm) một thiết bị USB tùy ý kích hoạt điều này
Tobias Kienzler

Đây là một khởi đầu tốt đẹp. Việc tắt máy được kích hoạt bằng nút GPIO (bất kỳ cách nào để đưa một thứ tương tự như vậy đến sự kiện ACPI hoặc HID?) Hoặc một cái gì đó thậm chí còn tiện dụng hơn.
XtL

@XTL: Có apci daemon xung quanh, vì vậy có thể (kernel báo cáo thông qua Proc, v.v.). Điều tương tự ít nhất có khả năng đúng với gpio trên pi. Các sự kiện HID có ngữ cảnh nhiều hơn (bối cảnh ví dụ là môi trường máy tính để bàn GUI) và thực tế là bạn có thể gõ "tạm dừng" (== shutdown -h nowtrên linux) có thể giảm thiểu nhu cầu như vậy;)
goldilocks

Điều này là hoàn hảo, dongle là thứ duy nhất được cắm vào Pi của chúng tôi và chúng tôi thường mất kết nối vì vậy sau đó chúng tôi cần di chuyển nó xung quanh, mà không làm hỏng nó do mất điện.
noio

8

Bạn có thể ra lệnh sau để tắt máy:

sudo init 0

Và để khởi động lại:

sudo init 6

Điều này phụ thuộc nhiều vào mức độ chạy là một khái niệm mà hệ điều hành vẫn sử dụng. Một sự thay đổi cho systemd làm cho điều này ngày nay ít sử dụng hơn.
Stephen Michael Kellat 13/07/2015

Không bao gồm chỉnh sửa từ hôm nay, bạn có thể nhận thấy đây là một câu trả lời khá cũ. Câu hỏi cũng lớn hơn hai tuổi.
Người dùng đã đăng ký

1
Trong cách sử dụng này, nó được coi là tốt hơn để sử dụng sudo telinit #trong đó # là một số từ 0 đến 6 - telinit là một liên kết tượng trưng đến init nhận ra rằng nó không được gọi bằng tên chính là "init" (và nó không có PID là 1!) Vì vậy, nó tạo ra một đường ống đến quá trình "init" thực sự và bảo nó thay đổi runlevel hiện tại thành giá trị mới được nêu dưới dạng đối số số . telinitlà một sự co lại của "Tell init the runlevel".
SlySven

7

Phương pháp ưa thích của tôi là sử dụng sudo poweroff, đó là bí danh cho lệnh tắt máy cũng giết chết việc sử dụng năng lượng.


7

Trong khi câu hỏi đã được trả lời thỏa đáng rồi; sở thích của tôi khác với những gì đã được trả lời.

Như những người khác đã nói tránh chỉ kéo sức mạnh. Các lệnh ưa thích của tôi (có thể là root hoặc thêm vào sudo):

Để tạm dừng: halt(đối với Wheezy và trước lệnh này cũng tắt nguồn hệ thống; đối với Jessie, nó không thực sự tắt nguồn mặc dù vẫn an toàn khi rút phích cắm sau khi kết thúc) halt -p; shutdown now -hhoặc đơn giản powerofflà bắt buộc đối với ...

Để khởi động lại: reboot

Tôi thích các lệnh này vì chúng thẳng về phía trước, dễ nhớ và hiển nhiên ...


Không có ý định huýt sáo nhưng tôi nghĩ rằng câu trả lời của tôi (từ 8 tháng trước) đã bị hạ thấp vì Debian (tức là thượng nguồn của Raspbian) đã thay đổi cách các lệnh của họ hoạt động (giả sử đó là lý do tại sao tôi bị bỏ phiếu) . Ngoài ra, câu trả lời của tôi (trước khi chỉnh sửa) vẫn trả lời OP (tức là nếu bạn tạm dừng hệ thống, có thể rút phích cắm an toàn ...) FWIW Tôi đã cập nhật câu trả lời để rõ ràng rằng điều này không còn hoạt động như người dùng có thể hy vọng ...
Jeremy Davis

Bạn không nên có thói quen sử dụng halthoặc poweroff, vì chúng chỉ là bí danh shutdown -h nowvới các công cụ GNU, nhưng trên các hệ thống khác, bạn sẽ tắt hệ thống ngay lập tức, giết chết tất cả các chương trình của bạn và có thể làm hỏng hệ thống tệp của bạn. Điều này cho biết, bạn có thể sử dụng nó trên một raspberry pi với hầu hết các bản phân phối linux, nhưng nếu bạn sử dụng pi để học, bạn có thể muốn thực hiện "đúng cách".
allo

@allo - Bạn cũng có thể đúng cho các hệ điều hành Linux kế thừa và các phiên bản Unix không phải Linux khác như HĐH (ví dụ BSD). Nhưng trong HĐH Linux gần đây sử dụng SystemD (tức là hầu hết Linux hiện nay) thì không phải vậy. halt, poweroff, rebootshutdowntất cả đều liên kết tượng trưng đến systemctl(với lệnh gốc cũng đã thông qua). Điều đó sau đó kích hoạt mục tiêu SystemD thích hợp: vd poweroff.target. FWIW poweroff.targetkích hoạt lệnh gọi ACPI để tắt hệ thống sạch sẽ. Vì vậy, AFAIK trong thời đại ngày nay poweroff(hoặc systemctl poweroff) LÀ "đúng cách". :)
Jeremy Davis

Giống như trong nhiều trường hợp với linux, có nhiều hơn một cách để làm điều đó. Nhưng bạn nên xem xét nếu bạn không muốn học theo cách được mô tả trong tiêu chuẩn, theo sau là các hệ thống unix khác. Có rất ít lợi ích cho bạn với tư cách là người dùng linux, nhưng ai biết khi nào bạn sẽ thử một số hệ thống khác trong tương lai? đừng dựa vào dừng lại và đừng dựa vào rm để có một --no-preserve-rootlá cờ. Đừng dựa vào / bin / sh Being / bin / bash (điều này thậm chí không còn đúng với các hệ thống dựa trên debian nữa). Sẽ rất hữu ích khi cố gắng sử dụng cách "đúng", ngay cả khi hiện tại nó sẽ hoạt động theo cách khác.
allo

1
@allo - Điểm công bằng và tôi nghĩ thật tuyệt vời khi bạn chia sẻ kiến ​​thức về các hệ thống khác nhau và tôi đồng ý rằng điều đó chắc chắn đáng chú ý về sự khác biệt giữa các hệ thống và các hạn chế có liên quan. Mặc dù tôi không đồng ý với đề nghị của bạn rằng cách của bạn là cách "đúng". Nó có thể là cách "tuân thủ posix", nhưng nó không làm cho một cách "đúng" và "sai" khác. Ví dụ: sử dụng bash (và bashism) là IMO hoàn toàn hợp pháp, mặc dù tôi đồng ý rằng nếu bạn cần / muốn bash, thì bạn nên sử dụng rõ ràng /bin/bash. FYI quan điểm của tôi là rất trung tâm Debian ...
Jeremy Davis

4

Chỉ cần ném nó vào, nếu bạn thêm một chút phần cứng, bạn có thể viết một daemon nhỏ để thăm dò các chân GPIO và sau khi xác nhận một pin nhất định, khởi động lại (hoặc tắt) Pi.

Ngoài ra, tất cả các lệnh được đề cập ở đây có thể được chạy qua SSH.


3

Tôi biết đó là 3 năm sau câu hỏi ban đầu. Nhưng tôi vừa nhận được Raspberry Pi và tôi gặp sự cố khi tắt nó nếu tôi quên kết nối nó với màn hình theo dõi và nó không có bất kỳ kết nối mạng nào.

Tôi đã viết một tập lệnh Python nhỏ để tự động tắt nó trong vòng 60 giây bằng cách cắm vào một ổ đĩa chứa tập tin có tên "pi_auto_shutdown".

Chỉ cần gọi kịch bản này từ RC.local.

Tôi hi vọng cái này giúp được.

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

Cách tiếp cận thú vị.
Eric Wilson

1

Tôi ssh vào hộp RPi của tôi bằng cách sử dụng lệnh

$ ssh rpi sudo poweroff

rpi là bí danh cho Địa chỉ IP của hộp RPi của tôi và được xác định trong tệp ~ / .ssh / config .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.