无头运行时如何关闭RPi


33

如果我无头运行Pi,是否可以使用命令安全关闭,还是应该简单地拔下电源线?


关闭
电源

poweroff可能是halt... 的符号链接!8
SlySven

Answers:


40

您可以使用以下方法安全关闭pi

shutdown -h now

-h只是停止所有进程


7
在-r将执行重新启动(关机+重新启动)的同时,可能值得学习。
XTL

6
不要忘记,您必须是root用户才能关机或使用sudo。
凯基

1
或者sudo poweroff
berto 2015年

3
-h确实使整个系统停止运行- 如果没有该选项,shutdowninit进入运行级别1-即单用户模式,等待超级用户登录(需要root密码)。以root身份登录然后注销后,init将重做使RPi进入多用户模式所需的内容-就像在原始启动过程中所做的一样(在完成所有内容(例如,fsck等)之后,运行/etc/rc.local它)然后)。在这种情况下,“关机”是“使普通用户
脱机

是的,但是shutdown实际上需要一些时间来执行,并且在连接任何ssh客户端时会断开连接。那么,您如何知道何时安全(例如,卸下SD卡)?
汤姆·奥格

40

不要简单地拔下电源线,因为这可能偶尔(可能经常)导致文件系统损坏。

正如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此处提到的所有命令,请参见,实际上是手册页;)


3
我不认为这是OP的要求。但是+1的信息。
文森特·P

整齐!您当然也应该能够移除(或插入)任意USB设备来触发此操作
Tobias Kienzler 2013年

这是一个不错的开始。通过GPIO按钮触发关闭操作(通过某种方式使ACPI或HID事件发生这种事情?)或其他操作会更加方便。
XTL

@XTL:周围有apci守护程序,因此是可能的(内核通过proc等报告)。至少对于pi上的gpio同样如此。HID事件更具上下文关系(示例上下文是GUI桌面环境),并且您可以键入“ halt”(shutdown -h now在Linux上==)这一事实可能减轻了
对此

这是完美的,加密狗是唯一插入Pi的东西,而且我们经常会断开连接,因此我们需要移动它,而不会因断电而损坏它。
noio 2013年

8

您可以发出以下命令来关闭:

sudo init 0

并重新启动:

sudo init 6

这在很大程度上取决于运行级别,而运行级别是操作系统仍在使用的概念。如今,向systemd的转移使这种方法的可用性降低了。
Stephen Michael Kellat

不包括今天的编辑,您可能已经注意到这是一个很旧的答案。这个问题还存在两年以上。
注册用户

1
在这种用法中,最好使用sudo telinit #其中#是0到6之间的数字-telinit是指向init的符号链接,该链接可以识别它不是由其主要名称“ init”调用的(并且它没有PID为1!),因此它将创建一个通往实际“ init”进程的管道,并告诉它将当前运行级别更改为以数值参数表示的新值telinit是“告诉新的运行级别”的缩写。
SlySven

7

我的首选方法是使用sudo poweroff,这是关闭命令的别名,它也可以减少电源使用。


7

这个问题已经得到充分回答;我的喜好与已经回答的喜好不同。

就像其他人所说的那样,避免仅仅拉扯力量。我的首选命令(以root或开头sudo):

暂停:(halt对于Wheezy和之前的命令,该命令还会关闭系统电源;对于Jessie,尽管可以在完成后安全地拔下插头,但实际上并没有关闭电源)halt -pshutdown now -h或仅仅poweroff是杰西所需要的...

要重启: reboot

我喜欢这些命令,因为它们简单明了,易于记忆且不言而喻。


并不是要抱怨,但我认为我的答案(来自8个月前)被否决有点苛刻,因为Debian(即Raspbian的上游)改变了其命令的工作方式(假设这就是为什么我被否决了) 。同样,我的答案(在编辑之前)仍然可以回答OP(即,如果您停止系统,可以安全地拔下插头...)FWIW我已经更新了答案,因此很明显,它不再可以作为用户使用希望...
杰里米·戴维斯

您不应该养成使用halt或的习惯poweroff,因为它们只是shutdown -h nowGNU工具的别名,但是在其他系统上,您将立即关闭系统电源,杀死所有程序并可能损坏文件系统。也就是说,您可以在大多数Linux发行版的树莓派pi上使用它,但是如果您使用pi进行学习,则可能需要“正确的方式”进行操作。
allo 2016年

@allo-对于传统的Linux OS和其他非Linux Unix之类的OS(例如BSD)变体,您可能也是正确的。但是在使用SystemD的最新Linux操作系统(即当今大多数Linux)中,情况并非如此。haltpoweroffrebootshutdown都是符号链接systemctl(与原来的命令也通过)。然后触发适当的SystemD目标:例如poweroff.target。FWIW poweroff.target触发ACPI调用以干净地关闭系统。因此,在这一时代poweroff(或今天),AFAIK systemctl poweroff是“正确的方法”。:)
杰里米·戴维斯

像在许多情况下使用linux一样,有多种方法可以做到这一点。但是,您应该考虑是否不想以标准中描述的方式学习它,其他unix系统也遵循该方法。作为linux用户,您受益不大,但是谁知道您将来何时会尝试其他系统?不要依赖暂停,也不要依赖rm来--no-preserve-root标记。不要依赖/ bin / sh是/ bin / bash(甚至对于基于debian的系统也不再如此)。尝试使用“正确”的方法通常很有用,即使当前它可以以其他方式起作用。
allo

1
@allo-公平的观点,我认为分享您对不同系统的知识真的很棒,我同意一定要注意系统之间的差异和相关限制。尽管我不同意您的建议,即您的方式是“正确”的方式。它可能是“符合posix的”方式,但是并没有使“正确”与“错误”成为另一种方式。例如,使用bash(和bashisms)是完全合法的IMO,尽管我同意如果您需要/想要bash,则应明确使用/bin/bash。仅供参考,我的观点非常以Debian为中心...
Jeremy Davis

4

只是为了投入使用,如果您要添加一些硬件,则可以编写一个小的守护程序来轮询GPIO引脚,并在确定某个引脚后重新启动(或关闭)Pi。

另外,这里提到的所有命令都可以通过SSH运行。


3

我知道最初的问题已经过去三年了。但是我刚拿到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()

有趣的方法。
埃里克·威尔逊

1

ssh登录到我的RPI箱使用命令

$ ssh rpi sudo poweroff

rpi是我的RPi框IP地址的别名,在〜/ .ssh / config文件中定义。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.