在关机或重新启动Raspberry Pi(运行Raspbian)之前,如何运行Bash脚本?

时间:2018-12-12 07:53:21

标签: raspberry-pi raspbian shutdown

我想在关闭或重新启动Pi之前运行Bash脚本(运行最新的Raspbian,这是Debian的衍生产品)。

例如如果我现在在命令提示符下键入sudo shutdown或sudo reboot,它应该在继续shutdown / reboot之前运行我的Bash脚本。

我创建了一个非常简单的脚本来进行测试,以确保在麻烦编写实际脚本之前可以使该方法起作用:

#!/bin/bash
touch /home/pi/ShutdownFileTest.txt

然后我将文件(称为CreateFile.sh)复制到/etc/init.d/CreateFile 然后,我在/etc/rc0.d/和/etc/rc6.d/中创建符号链接:

sudo ln -s /etc/init.d/CreateFile K99Dave

我不确定该符号链接的正确命名是什么。有些网站说“以K开头文件名”,有些网站说“以S开头”,有人说:“以K99开头,以便在正确的时间运行” ...

我实际上最终尝试了以下所有方法(当然不是一次全部尝试,而是一次一次):

sudo ln -s /etc/init.d/CreateFile S00Dave
sudo ln -s /etc/init.d/CreateFile S99Dave
sudo ln -s /etc/init.d/CreateFile K00Dave
sudo ln -s /etc/init.d/CreateFile K01rpa
sudo ln -s /etc/init.d/CreateFile K99Dave

创建每个符号链接后,我总是运行:

sudo chmod a+x /etc/init.d/CreateFile && sudo chmod a+x /etc/rc6.d/<name of symlink>

然后我每次都重新启动。

每次都未创建/home/pi/ShutdownFileTest.txt中的文件;该脚本未执行。

我在较旧的帖子中发现了this comment,这表明上述方法已过时:

  

执行此操作的现代方法是通过systemd。请参阅“手动关闭系统”   有关详细信息。基本上,将可执行的shell脚本放入   / lib / systemd / system-shutdown /。它传递了一个类似“暂停”的参数   或“重新启动”,如果您   需要。

我将脚本复制到/ lib / systemd / system-shutdown /中,chmod + x并重新启动,但仍然没有成功。

我注意到上面的评论说脚本是作为参数传递给“暂停”或“重新引导”的。由于它在两种情况下都应相同地运行,因此我认为它实际上不需要处理该参数。我也不知道该如何处理这个论点,所以我不确定是否需要做些什么来使该工作有效……

有人可以告诉我我要去哪里错吗?

预先感谢, 戴夫

2 个答案:

答案 0 :(得分:2)

事实证明,在执行这些脚本之前,部分shutdown命令已经执行(并卸载了文件系统)。

因此,有必要在脚本的开头挂载文件系统,并在脚本的结尾挂载文件系统。

只需添加:

mount -oremount,rw /

...在脚本开头(在#!/ bin / bash下面)

...然后有脚本的代码...

,然后使用以下命令完成脚本:

mount -oremount,ro /

因此,OP脚本应变为:

#!/bin/bash
mount -oremount,rw /
touch /home/pi/ShutdownFileTest.txt
mount -oremount,ro /

......然后在关机/重新启动之前创建文件/home/pi/ShutdownFileTest.txt。


也就是说,使用此方法可能不是最佳实践。相反,最好创建一个服务,该服务在计算机打开且正常运行时运行,但在服务终止时(在关闭/重新启动时)运行所需的脚本。

对此进行了详细的here解释,但本质上是:

1:创建一个文件(我们将其命名为example.service)。

2:将以下内容添加到example.service:

[Unit]
Description=This service calls shutdownScript.sh upon shutdown or reboot.

[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=/home/pi/shutdownScript.sh

[Install]
WantedBy=multi-user.target

3:通过运行sudo mv /home/pi/example.service /etc/systemd/system/example.service

将其移至systemd的正确目录中。

4:确保关闭后启动的脚本具有适当的权限:chmod u+x /home/pi/shutdownScript.sh

5:启动服务:sudo systemctl start example --now

6:使服务在启动时自动启动:sudo systemctl enable example

7:停止服务:sudo systemctl stop example

最后一条命令将模拟系统关闭时通常会发生的情况,即它将运行/home/pi/shutdownScript.sh(实际上并未关闭系统)。

然后您可以重新启动两次,并且应该从第二次重新启动开始起作用。

编辑:不,不,不。我第一次对其进行测试时,它就起作用了,但是之后就停止了工作。不知道为什么。如果我知道如何使它起作用,我将编辑此答案并删除此消息(或者如果其他人知道,请随时为我编辑答案)。

答案 1 :(得分:0)

由于我没有足够的敏感度来发表评论,因此我对此表示敬意。

我在ZPMMaker的答案中增加了一步,它似乎至少对我有用。

sudo chmod u+x /etc/systemd/system/example.service