我想在关闭或重启我的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”或“reboot”这样的参数,如果需要,可以区分各种情况。
我将我的脚本复制到/ lib / systemd / system-shutdown /,chmod + x,然后重新启动,但仍然没有成功。
我注意到上面的注释说该脚本作为参数传递“halt”或“reboot”。因为它应该在两种情况下都运行相同,我认为它不应该真正处理那个参数。我也不知道如何处理这个论点,所以我不确定我是否需要做一些事情才能做到这一点......
有人可以告诉我哪里出错了吗?
提前谢谢,戴夫
事实证明,在执行这些脚本之前,部分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(不实际关闭系统)。
然后,您可以重新启动两次,它应该从第二次重新启动开始工作。
编辑:不,不,不。它是我第一次测试它,但在那之后停止工作。不知道为什么。如果我弄清楚如何使它工作,我将编辑这个答案并删除此消息(或者如果其他人知道,请随时为我编辑答案)。
由于我没有足够的资历来发表评论,这是一个新的答案我为此道歉。
我向ZPMMaker的答案添加了一步,它似乎至少对我有用。
sudo chmod u+x /etc/systemd/system/example.service