Преобразование часов в файловую систему 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 для ответов!