Linux 服务故障

Linux 服务故障

我正在编写一个 Linux 服务测试程序,作为我正在开发的项目的先行程序。我试图了解它的工作原理以及它现在失败的原因。

我目前的目标是创建一个 Linux(在我的例子中是 Ubuntu)服务,check.txt用于监视文本文件的变化。该文件的当前内容只是第一行上的单词“yes”(虽然没有引号)。我希望我的服务将单词“yes”更改为“no”,并且如果我在任何时候进入并将其更改为“yes”,则将其改回“no”。这是我目前所拥有的。


我的服务文件: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. 

答案1

看起来您的脚本缺少执行权限。

您可以使用以下方法修复该问题:

$ chmod +x trial.sh

在这种情况下,即使以 root 身份运行也无法起作用,否则 root 可以绕过权限,但文件本身需要可执行才能运行。

(以 root 身份运行意味着主目录本身的权限在大多数情况下并不重要,即使在某些情况下(例如 NFS 安装的主目录或诸如 AppArmor 或 SELinux 之类的安全模块可能会阻止 root 访问主目录。)

解决此问题的一个好方法是尝试从 root shell 直接运行此脚本,而不是在 systemd 下运行。如果你这样做了,你会发现它会因同样的原因而失败:

# cd /home/jeremiahdgage/
# ./trial.sh
bash: ./trial.sh: Permission denied

这可以告诉您,将其作为服务运行并不是真正的问题,因为您也可以从 shell 中重现它。

相关内容