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
có lẽ là một liên kết tượng trưng đến halt
...! 8-)
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
có lẽ là một liên kết tượng trưng đến halt
...! 8-)
Câu trả lời:
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
sudo poweroff
-h
không ngừng toàn bộ hệ thống - mà không cần tùy chọn đó shutdown
sẽ 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, init
sau đó 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ứ, fsck
v.v., chạy /etc/rc.local
nó 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" ...
shutdown
thự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?
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 .rules
và 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.rules
sẽ 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;)
shutdown -h now
trên linux) có thể giảm thiểu nhu cầu như vậy;)
Bạn có thể ra lệnh sau để tắt máy:
sudo init 0
Và để khởi động lại:
sudo init 6
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ố . telinit
là một sự co lại của "Tell init the runlevel".
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 -h
hoặc đơn giản poweroff
là 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 ...
halt
hoặc poweroff
, vì chúng chỉ là bí danh shutdown -h now
vớ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".
halt
, poweroff
, reboot
Và shutdown
tấ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.target
kí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". :)
--no-preserve-root
lá 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.
/bin/bash
. FYI quan điểm của tôi là rất trung tâm Debian ...
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()
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 .