Преобразование часов в файловую систему 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 ответ:
Таким образом, причина, по которой я узнал (от суперпользователя) об этой ошибке, была именно в том, что было в моей консоли ошибок, т. е.
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 для ответов!