首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使bash脚本作为服务运行的正确方法

使bash脚本作为服务运行的正确方法
EN

Stack Overflow用户
提问于 2020-03-02 15:27:20
回答 1查看 1.8K关注 0票数 0

我有一个简单的脚本,监测我的笔记本的电池水平。我设置*.service文件的方式有什么问题,因为我一直在获取(code=exited, status=1/FAILURE)错误。

batterylevel-warning.sh

权限设置为777。

代码语言:javascript
复制
#!/bin/bash

CRITICAL_PERCENTAGE=`cat /sys/class/power_supply/BAT0/capacity`
STATUS=`cat /sys/class/power_supply/BAT0/status`
ICON="/usr/share/icons/Paper/512x512/status/battery-low.png"

if [ $STATUS == "Discharging" ]; then
    if [ $CRITICAL_PERCENTAGE -eq 20 ]; then
        notify-send -u critical -t 2000 -i $ICON "You need to charge your battery now!!! It is at $CRITICAL_PERCENTAGE%!!!"
    fi
fi

batterylevel.service

代码语言:javascript
复制
[Unit]
Description=Send alerts on low battery starting at 25%.

[Service]
Type=simple
ExecStart=/bin/bash /home/myhome/.scripts/batterylevel-warning.sh

[Install]
WantedBy=multi-user.target

实施

代码语言:javascript
复制
# Create sym link
sudo ln-s /home/myhome/.scripts/batterylevel.service /etc/systemd/system
# Enable and start
sudo systemctl enable batterylevel.service
sudo systemctl start batterylevel.service

问题:当电池电量达到25%时,我运行sudo systemctl status batterylevel.service并得到:

代码语言:javascript
复制
● batterylevel.service - Send alerts on low battery starting at 25%. Designed for silverlance.
   Loaded: loaded (/home/myhome/.scripts/batterylevel.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Mon 2020-03-02 23:04:02 PST; 4s ago
  Process: 5357 ExecStart=/bin/bash /home/myhome/.scripts/batterylevel-warning.sh (code=exited, status=1/FAILURE)
 Main PID: 5357 (code=exited, status=1/FAILURE)

我还在那里运行了sudo systemctl daemon-reload,但仍然没有成功。很抱歉寄了这么长的邮筒。

EN

回答 1

Stack Overflow用户

发布于 2020-03-02 16:00:25

所以这里有两个问题。

第一个问题是,systemd希望simple服务永远运行。当前,当您运行systemctl start,然后终止时,您的脚本只运行一次。这很好,而且有几个服务是这样工作的,但我不认为这是你想要的。尝试对脚本进行重新编码以进行投票:

代码语言:javascript
复制
while true; do
    if [ $STATUS == "Discharging" ]; then
        if [ $CRITICAL_PERCENTAGE -eq 20 ]; then
            notify-send -u critical -t 2000 -i $ICON "You need to charge your battery now!!! It is at $CRITICAL_PERCENTAGE%!!!"
        fi
    fi
    sleep 60
done

第二个问题是,脚本中的某些内容正在返回错误代码。最明显的候选是notify-send命令。notify-send不太可能从systemd联系到您的桌面管理器,所以这几乎肯定是问题所在。下面的Stack文章描述了让notify-sendcron下运行的类似问题。为了让它在systemd下运行,您需要执行类似的操作。也就是说,让systemd直接与桌面管理器对话总是很棘手的,所以最好采用另一种方法。https://unix.stackexchange.com/questions/111188/using-notify-send-with-cron

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60491957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档