Правильный способ сделать скрипт bash запущенным как сервис - PullRequest
0 голосов
/ 02 марта 2020

У меня есть простой скрипт, который контролирует уровень заряда батареи моего ноутбука. Что-то не так с тем, как я настроил свой файл *. Service , так как я получаю ошибки (code=exited, status=1/FAILURE).

предупреждение уровня батареи. sh

Разрешения установлены на 777.

#!/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

[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

Реализация

# 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 и получаю:

● 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 где-то там, но все равно безуспешно. Извините за длинный пост.

1 Ответ

0 голосов
/ 02 марта 2020

Итак, здесь есть две проблемы.

Первая проблема заключается в том, что systemd ожидает, что simple службы будут работать вечно. В настоящее время ваш скрипт будет запускаться один раз при запуске systemctl start, а затем завершаться. Это нормально, и некоторые службы работают таким образом, но я не думаю, что это то, что вы хотели. Попробуйте перекодировать ваш скрипт для опроса:

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 Exchange описывается похожая проблема, с которой кто-то заставлял notify-send работать под cron. Вам нужно будет сделать что-то похожее, чтобы запустить его под systemd. Тем не менее, заставить systemd напрямую общаться с менеджером рабочего стола всегда будет сложно, поэтому может быть лучше использовать другой подход. https://unix.stackexchange.com/questions/111188/using-notify-send-with-cron

...