我想在关闭或重新启动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并重新启动,但仍然没有成功。
我注意到上面的评论说脚本是作为参数传递给“暂停”或“重新引导”的。由于它在两种情况下都应相同地运行,因此我认为它实际上不需要处理该参数。我也不知道该如何处理这个论点,所以我不确定是否需要做些什么来使该工作有效……
有人可以告诉我我要去哪里错吗?
预先感谢, 戴夫
答案 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
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