我正在编写一个 linux 服务 test-thingy 作为我正在开发的项目的前身。我试图了解它是如何工作的,以及为什么它现在失败了。
我目前的目标是创建一个 linux(在我的例子中是 Ubuntu)服务来监控文本文件 ,check.txt
的变化。该文件的当前内容只是第一行上的单词“yes”(虽然没有引号)。我希望我的服务将“是”一词更改为“否”,如果我随时进入并将其更改为“是”,则将其更改回“否”。这就是我到目前为止所拥有的。
我的服务文件:trial.service
[Service]
ExecStart=/home/jeremiahdgage/trial.sh
User=root
Group=root
我知道在此处使用 root 不是最佳做法,但稍后将有必要,所以我现在将其保留。
我的 bash 文件:trial.sh
#!/bin/bash
while true
do
line=$(head -n 1 filename)
if [ "$line" == "yes" ]
then
sudo sed -i 's/yes/no/g' /home/jeremiahdgage/check.txt
fi
echo changes made at $(date)
sleep 1
done
while true
意味着它永远存在,line
是我文档的第一行。我检查第一行,看看它是否“是”,然后我用sed
它来交换“否”。我关闭我的 if,回显时间并休眠 1 毫秒,然后再次重复该过程。
但是,出现了问题,因为我的服务无法启动......如果我用 来检查我的状态systemctl status trial.service
,它会说 Exec 出现“权限被拒绝”错误。
我做错了什么?
更新:
Service now starts but bash code does not work.
您的脚本中似乎缺少执行权限。
您可以通过以下方式解决此问题:
这是一种即使以 root 身份运行也不起作用的情况,root 可以绕过权限,但文件本身需要可执行才能运行。
(以 root 身份运行意味着在大多数情况下主目录本身的权限并不重要,即使在某些情况下,例如 NFS 挂载的主目录或 AppArmor 或 SELinux 等安全模块可能会阻止 root 访问主目录。)
解决此问题的一个很好的第一步是实际尝试从 root shell 直接运行此脚本,而不是在 systemd 下。如果你这样做了,你会注意到它会因为同样的原因而失败:
这可以告诉您,将它作为服务运行并不是真正的问题,因为您也可以从 shell 复制它。