我希望每次启动时都使用/etc/rc.local
.
例如,我的脚本被调用,startscript.sh
其存储位置/home/debian
如下。它首先尝试创建一个名为 的文件test.log
,然后执行其他操作。
但是,我在启动时读到了错误touch: cannot touch ‘test.log’: Permission denied
rc.local
根据我的理解,如果以 root 身份运行,因此它执行的任何内容也应该以 root 身份运行,因此无论如何都test.log
应该创建,这怎么可能?
startscript.sh
:
#!/bin/sh
touch test.log
#... other stuff
rc.local
片段:
#!/bin/sh -e
#.. other stuff
sh /home/debian/startscript.sh
答案1
这种方法有两个问题。一是rc.local
由 root 执行,因此它创建的所有文件都将归 root 所有,除非您chown
在它们上运行。其次,这是一个安全漏洞,root 执行的代码可能会被没有 root 权限的用户修改。
更好的方法是使用@重启cron
作为非特权用户的时间说明符。如果您已经有定时任务文件,编辑它以添加此行,然后运行crontab <yourcrontab>
命令。或者使用crontab -e
命令直接输入这一行。
@reboot /home/debian/startscript.sh
请注意,您不需要sh
脚本是否可执行,因为它以#!/bin/sh
.
答案2
如果您的发行版使用systemd
,问题可能在于/etc/rc.local
执行太早了,而根文件系统仍然是只读的,或者某些其他文件系统尚未安装。
.service
如果运行的systemd文件rc.local
没有配置特定的顺序依赖项,systemd
将尽早运行它。
运行systemctl cat rc-local.service
以查看运行的服务的完整定义rc.local
。注意任何After=
线路,并考虑系统启动过程中最早可以满足这些线路的点。您可能想要添加一个覆盖文件,该文件会添加一After=
两行以满足您的配置需求。