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

问题描述 投票:2回答:2

我想在关闭或重启我的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。有关详细信息,请参阅“man systemd-shutdown”。基本上,在/ lib / systemd / system-shutdown /中放置一个可执行的shell脚本。它会传递一个像“halt”或“rebo​​ot”这样的参数,如果需要,可以区分各种情况。

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

我注意到上面的注释说该脚本作为参数传递“halt”或“rebo​​ot”。因为它应该在两种情况下都运行相同,我认为它不应该真正处理那个参数。我也不知道如何处理这个论点,所以我不确定我是否需要做一些事情才能做到这一点......

有人可以告诉我哪里出错了吗?

提前谢谢,戴夫

raspberry-pi raspbian shutdown
2个回答
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。


也就是说,使用此方法可能不是最佳做法。相反,最好创建一个在计算机打开并正常运行时运行的服务,但在服务终止时运行所需的脚本(在shutdown / reboot时发生)。

这是详细解释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(不实际关闭系统)。

然后,您可以重新启动两次,它应该从第二次重新启动开始工作。

编辑:不,不,不。它是我第一次测试它,但在那之后停止工作。不知道为什么。如果我弄清楚如何使它工作,我将编辑这个答案并删除此消息(或者如果其他人知道,请随时为我编辑答案)。


0
投票

由于我没有足够的资历来发表评论,这是一个新的答案我为此道歉。

我向ZPMMaker的答案添加了一步,它似乎至少对我有用。

sudo chmod u+x /etc/systemd/system/example.service
© www.soinside.com 2019 - 2024. All rights reserved.