Рейтинг:1

Параметр Systemd ExecStart недоступен внутри скрипта

флаг in

У меня очень странная ситуация.

у меня системный юнит

[Ед. изм]
Description=Ночное задание резервного копирования снимков для тома [%i]

[Оказание услуг]
Тип=простой
KillMode=процесс
EnvironmentFile=/etc/systemd/schedule-backup_%i.conf
ExecStart=/usr/local/bin/backup.sh -s '$SOURCE' -b '$BACKUP' -t '$TITLE' -l 'backup_%i.log'

Когда я выполняю это с экземпляром службы: sudo systemctl запустить расписание[email protected]

скрипт backup.sh вообще не получает последний параметр. Должен получиться "backup_projects.log"

Я читаю параметры с помощью

в то время как getopts s:b:t:l: флаг
делать
    case "${flag}" в
        s) source_path_root="${OPTARG}";;
        б) backup_path_root="${OPTARG}";;
        т) email_title="${OPTARG}";;
        м) имя_журнала="${OPTARG}";;
    эсак
сделано

когда я проверяю журналы службы, кажется, что скрипт вызывается с соответствующими параметрами:

systemctl -l статус [email protected] -n50

○ [email protected] — ночное задание резервного копирования снимков для тома [проекты]
     Загружено: загружено (/etc/systemd/system/[email protected]; статично)
     Активен: неактивен (мертв) со вторника 14 декабря 2021 г., 12:47:01 EET; 16 минут назад
TriggeredBy: расписание-backup_projects.timer
    Процесс: 8161 ExecStart=/usr/local/bin/backup.sh -s $SOURCE -b $BACKUP -t $TITLE -l backup_projects.log (code=exited, status=0/SUCCESS)
   Основной PID: 8161 (код=выход, статус=0/УСПЕХ)
        ЦП: 3,122 с

14 декабря, 12:46:56 падший робот systemd[1]: запущено задание ночного резервного копирования моментальных снимков для тома [проекты].
14 декабря 12:46:56 падший робот backup.sh[8161]: /usr/local/bin/backup.sh: строка 37: /var/log/: это каталог
14 декабря, 12:46:56 падший робот backup.sh[8161]: файл журнала установлен в /var/log/

Когда я запускаю тот же скрипт из консоли, параметр принимается нормально. Что я делаю не так?

РЕДАКТИРОВАТЬ: Похоже, это сработало, когда я поставил параметр -l в начале, а не в конце. Может быть проблема с getopts. Я приму ответ от любого, кто может это объяснить

Рейтинг:1
флаг in

Я нашел проблему, systemd имеет свои собственные правила для переменных из EnvironmentFiles

https://fedoraproject.org/wiki/Packaging:Systemd#EnvironmentFiles_and_support_for_.2Fetc.2Fsysconfig_files

Это говорит

Затем вы можете обратиться к переменным, установленным в файле /etc/sysconfig/httpd. с ${FOOBAR} и $FOOBAR в строках ExecStart= (и связанных с ними линии). (${FOOBAR} расширяет переменную до одного слова, $FOOBAR разделяет значение переменной в пробеле в несколько слов)

После того, как я изменил свою строку на

ExecStart=/usr/local/bin/backup.sh -s ${SOURCE} -b ${BACKUP} -t ${TITLE} -l backup_%i.log

Мои проблемы исчезли, в том числе проблема с TITLE, которая содержала пробелы. Без {} TITLE был расширен до 3 слов, и поскольку второе и третье появляются без '-' в getopts, дальнейшая обработка параметров будет остановлена ​​и, таким образом, будет проигнорирована часть -l backup_%i.log.

getopts реализует стандартную обработку опций, т. е. перестает искать варианты, когда либо видит аргумент, который не опция ...

любезно предоставлено https://unix.stackexchange.com/a/666748/499351

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.