Служба Systemd, выполняющая скрипт bash, не работает

У вас есть IP-адрес, сохраненный в i, поэтому вы можете добавить его в свою электронную почту следующим образом:

#!/bin/bash

proxy_targets=( 'http://10.1.1.4:3128' 'http://10.1.1.5:3128' 'http://10.1.1.6:3128' )
failed_hosts=

for i in "${proxy_targets[@]}"
do
    exit_code=$(http --check-status --ignore-stdin --timeout=2.5 "--proxy=$i" HEAD www.msftncsi.com/ncsi.txt &> /dev/null; echo $?)
    if ((exit_code==0))
    then
        echo 'OK!'
    else
        ip=${i#http://}     # Removes http:// from variable
        ip=${ip%:[0-9]*}    # Removes port from the end
        case $exit_code in
            2)  echo 'Request timed out!' | \
                mail -s "The following WSA has failed to pass traffic: ${ip}, with the following error: $exit_code" moe.abdel@childrens.harvard.edu  
            ;;
            3)  echo 'Unexpected HTTP 3xx Redirection!' | \
                mail -s "The following WSA has failed to pass traffic: ${ip}, with the following error: $exit_code" katkota@newwork.com  
            ;;
            4)  echo 'HTTP 4xx Client Error!' | \
                mail -s "The following WSA has failed to pass traffic: ${ip}, with the following error: $exit_code" katkota@newwork.com  
            ;;
            5)  echo 'HTTP 5xx Server Error!' | \
                mail -s "The following WSA has failed to pass traffic: ${ip}, with the following error: $exit_code" katkota@newwork.com  
            ;;
            6)  echo 'Exceeded --max-redirects=<n> redirects!' | \
                mail -s "The following WSA has failed to pass traffic: ${ip}, with the following error: $exit_code" katkota@newwork.com  
            ;;
            *)  echo 'Other Error!' | \
                mail -s "The following WSA has failed to pass traffic: ${ip}, with the following error: $exit_code" katkota@newwork.com 
            ;;
        esac
    fi
done
  • Я поместил proxy_targetsв массив
  • Я процитировал --proxy=$iи убрал из него лишнее http://
  • Я сохраняю код выхода в переменной, поэтому он сохраняется после присваивания переменной
  • Используя расширение параметра, у меня есть ipна текущий адрес, удалив http :// и порт
  • Я добавил ipи exit_codeв тему письма.
1
26.08.2020, 23:27
1 ответ

При запуске чего-либо, что взаимодействует с сервером X -, службы systemd становятся немного сложнее. Есть два основных способа сделать это:

  1. Запустить службу пользователя
  2. Установите $DISPLAYи не запускайте, пока не будет достигнуто значение graphical.target.

Чтобы запустить это как пользовательскую службу -, переместите myfirst.serviceв ~/.config/systemd/system/. Затем удалите User=и установите WantedBy=на default.target. default.targetдостигается, когда пользователь входит в систему. Когда-нибудь будет graphical-session.target, который будет достигнут, когда пользователь войдет в среду рабочего стола, но пока он недоступен. Вместо этого мы запускаем default.target, который достигается, когда пользователь входит в систему. Если вы используете диспетчер отображения, то, вероятно, до этого у вас был сеанс x -.

[Unit]
Description=Command Service
After=default.target

[Service]
ExecStart=/bin/xbindkeys
ExecStartPost=/bin/setxkbmap -layout gb
Type=simple
Restart=on-abort

[Install]
WantedBy=default.target

Обязательно используйте --userпри работе с данным устройством, например:

systemctl --user daemon-reload
systemctl --user start myfirst.service
systemctl --user enable myfirst.service

Чтобы сохранить это как системную службу, оставьте файл в /etc/systemd/system/, и вам нужно будет установить среду, чтобы он мог подключаться к серверу X -. Наконец, обязательно сделайте это WantedBy=graphical.target. Это гарантирует, что он не попытается подключиться к серверу X -до запуска сервера X -. Однако я не уверен, что это всегда будет успешно, потому что я не уверен, что.Xauthority действителен, пока вы не войдете в систему.

[Unit]
Description=Command Service
After=graphical.target

[Service]
ExecStart=/bin/xbindkeys
ExecStartPost=/bin/setxkbmap -layout gb
Type=simple
User=user1
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/user1/.Xauthority
Restart=on-abort

[Install]
WantedBy=graphical.target

Системный -общий сервис становится немного странным, если у вас несколько пользователей или несколько дисплеев. Рекомендуется выполнять определенные действия пользователя -. Если вы находитесь в среде рабочего стола,вы можете echo $DISPLAYи echo $XAUTHORITY, чтобы выяснить, что установить для этих переменных.


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

systemctl daemon-reload

Если вы экспериментировали, сначала systemctl disable myfirst.serviceубедитесь, что systemctl start myfirst.serviceработает, тогда вы сможете systemctl enable myfirst.service. enableсоздаст символическую ссылку в default.targetили graphical.target, чтобы при перезагрузке вызывалась ваша служба. Чтобы избежать путаницы с этими ссылками во время эксперимента, просто не включайте его, пока не будете готовы к тестированию перезагрузки.


Заметьте, у меня есть странное подозрение по поводу этой строки /bin/xbindkeys &в вашем скрипте bash. Обычно xbindkeysвсегда работает? Если это так, вы можете изменить свой ExecStart=на :

.
ExecStart=/bin/xbindkeys
ExecStartPost=/bin/setxkbmap -layout gb
Type=simple

Я уже внес эти изменения в предложенные выше единицы измерения.

Это гарантирует, что systemd отслеживает процесс напрямую, а не разветвляется. Поскольку для Type=не установлено значение forking, я подозреваю, что сценарий bash завершится, и systemd не будет отслеживать PID xbindkeys, оставив его как потерянный PID и не имея возможности его остановить. Если вы оставите xbindkeysкак часть ExecStart, то остановка службы завершит работу xbindkeys (, что, я думаю, не удастся сделать прямо сейчас ). В этом случае вы также захотите установить Type=simple, потому что oneshotбольше не будет применяться.

0
18.03.2021, 23:09

Теги

Похожие вопросы