Преобразование часов в файловую систему unitd


У меня есть сценарий оболочки следующим образом

Ss.sh

#!/bin/bash
opFile="custom.data"
sourceFile="TestOutput"
./fc app test > $sourceFile
grep -oP '[0-9.]+(?=%)|[0-9.]+(?=[A-Z]+ of)' "$sourceFile" | tr 'n' ',' > $opFile
sed -i 's/,$//' $opFile

Требование состоит в том, что мне нужно использовать этот скрипт с командой watch. И я хотел бы превратить это в службу systemctl. Я так и сделал.

Sc.sh

#!/bin/bash
watch -n 60 /root/ss.sh

И в моем /etc / systemd / system,

Log_info.сервис

[Unit]

Description="Test Desc"
After=network.target

[Service]
ExecStart=/root/sc.sh
Type=simple

[Install]
WantedBy=default.target

Когда я запускаю systemctl, запускаю log_info.служба, она работает, но не непрерывно, как мне бы хотелось.

При запуске статуса sytemctl log_info.служба,

info_log.service - "Test Desc"
   Loaded: loaded (/etc/systemd/system/info_log.service; disabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Mon 2016-09-12 08:17:02 UTC; 2min 18s ago
  Process: 35555 ExecStart=/root/sc.sh (code=exited, status=1/FAILURE)
 Main PID: 35555 (code=exited, status=1/FAILURE)

Sep 12 08:17:02 mo-b428aa6b4 systemd[1]: Started "Test Desc".
Sep 12 08:17:02 mo-b428aa6b4 sc.sh[35654]: Error opening terminal: unknown.
Sep 12 08:17:02 mo-b428aa6b4 systemd[1]: info_log.service: Main process exited, code=exited, status=1/FAILURE
Sep 12 08:17:02 mo-b428aa6b4 systemd[1]: info_log.service: Unit entered failed state.
Sep 12 08:17:02 mo-b428aa6b4 systemd[1]: info_log.service: Failed with result 'exit-code'.

Есть идеи, почему он не работает правильно? Любая помощь будет оценена по достоинству!

1 3

1 ответ:

Таким образом, причина, по которой я узнал (от суперпользователя) об этой ошибке, была именно в том, что было в моей консоли ошибок, т. е.

Error opening terminal: unknown

Наблюдение может быть выполнено только с терминала, поскольку оно требует доступа к терминалу, в то время как службы не имеют такого доступа.

Возможной альтернативой для просмотра может быть использование команды, которая не требует терминала, например screen или tmux. Или, другой вариант, который работал для меня, который был предложен grawity на superuser, был
# foo.timer
[Unit]
Description=Do whatever

[Timer]
OnActiveSec=60
OnUnitActiveSec=60

[Install]
WantedBy=timers.target

В логика этого была в том, что нужно было запускать сценарий каждые 60 секунд, а не использовать часы. Следовательно, grawity предположил, что я использую юнит-файл таймер, который вызывает файл на сервис каждые 60 сек. Если у сервисного блока было другое имя, чем у таймера, то можно использовать [Timer] Unit=.

Надеюсь, что это помогло вам и +1 к grawity и Eric Renouf из superuser для ответов!