Answers:
您可以使用以下方法安全关闭pi
shutdown -h now
-h只是停止所有进程
sudo poweroff
-h
确实使整个系统停止运行- 如果没有该选项,shutdown
将init
进入运行级别1-即单用户模式,等待超级用户登录(需要root密码)。以root身份登录然后注销后,init
将重做使RPi进入多用户模式所需的内容-就像在原始启动过程中所做的一样(在完成所有内容(例如,fsck
等)之后,运行/etc/rc.local
它)然后)。在这种情况下,“关机”是“使普通用户
shutdown
实际上需要一些时间来执行,并且在连接任何ssh客户端时会断开连接。那么,您如何知道何时安全(例如,卸下SD卡)?
不要简单地拔下电源线,因为这可能偶尔(可能经常)导致文件系统损坏。
正如Impluss所说,请使用shutdown
。我最近遇到了有关配置udev以在拔出特定USB设备时触发关机或重新启动的提示。如果系统变得无响应或失去网络连接,并且您无法或不会费心将诸如键盘之类的隐藏(人机接口)设备插入其中,则此功能很有用。
|有一个关于udev规则的不错的,也许有些过时但写得很好的介绍|这里|。。基本想法是,您可以通过获得有关设备的一些信息lsusb
,例如:
Bus 002 Device 003: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN
标记为ID的第三个字段是由冒号分隔的供应商和型号ID。假设您没有插入多个相同的设备,则此组合应该是唯一的。
您可以通过获得更详细的相关信息udevadm monitor --udev --property
,这些信息将报告给标准,直到您将其杀死。当我从上方拔下teenieweenie 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
在Linux上==)这一事实可能减轻了
您可以发出以下命令来关闭:
sudo init 0
并重新启动:
sudo init 6
sudo telinit #
其中#是0到6之间的数字-telinit是指向init的符号链接,该链接可以识别它不是由其主要名称“ init”调用的(并且它没有PID为1!),因此它将创建一个通往实际“ init”进程的管道,并告诉它将当前运行级别更改为以数值参数表示的新值。 telinit
是“告诉新的运行级别”的缩写。
这个问题已经得到充分回答;我的喜好与已经回答的喜好不同。
就像其他人所说的那样,避免仅仅拉扯力量。我的首选命令(以root或开头sudo
):
暂停:(halt
对于Wheezy和之前的命令,该命令还会关闭系统电源;对于Jessie,尽管可以在完成后安全地拔下插头,但实际上并没有关闭电源)halt -p
;shutdown now -h
或仅仅poweroff
是杰西所需要的...
要重启: reboot
我喜欢这些命令,因为它们简单明了,易于记忆且不言而喻。
halt
或的习惯poweroff
,因为它们只是shutdown -h now
GNU工具的别名,但是在其他系统上,您将立即关闭系统电源,杀死所有程序并可能损坏文件系统。也就是说,您可以在大多数Linux发行版的树莓派pi上使用它,但是如果您使用pi进行学习,则可能需要“正确的方式”进行操作。
halt
,poweroff
,reboot
和shutdown
都是符号链接systemctl
(与原来的命令也通过)。然后触发适当的SystemD目标:例如poweroff.target
。FWIW poweroff.target
触发ACPI调用以干净地关闭系统。因此,在这一时代poweroff
(或今天),AFAIK systemctl poweroff
是“正确的方法”。:)
--no-preserve-root
标记。不要依赖/ bin / sh是/ bin / bash(甚至对于基于debian的系统也不再如此)。尝试使用“正确”的方法通常很有用,即使当前它可以以其他方式起作用。
/bin/bash
。仅供参考,我的观点非常以Debian为中心...
我知道最初的问题已经过去三年了。但是我刚拿到Raspberry Pi,如果忘记将其连接到监视器屏幕并且没有任何网络连接,则无法关闭它。
我编写了一个小的Python脚本,通过插入包含名为“ pi_auto_shutdown”的文件的thumbdrive来自动在60秒内将其关闭。
只需从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()
我ssh登录到我的RPI箱使用命令
$ ssh rpi sudo poweroff
rpi是我的RPi框IP地址的别名,在〜/ .ssh / config文件中定义。