将 watch 命令转换为单元文件 systemd

将 watch 命令转换为单元文件 systemd

我有一个如下的 shell 脚本

ss存档

#!/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 服务。我这样做了。

上海

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

在我的/etc/systemd/system中,

日志信息服务

[Unit]

Description="Test Desc"
After=network.target

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

[Install]
WantedBy=default.target

当我运行 systemctl start log_info.service 时,它​​会运行,但不是按照我希望的方式连续运行。

运行 sytemctl status log_info.service 时,

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

正如错误消息所示,watch只能从终端使用:

Error opening terminal: unknown

但你的要求很可能不是使用脚本watch。您的要求是每 60 秒运行一次,并且watch是您最终选择的工具。

每 60 秒运行一次脚本的最常见方法是计划任务– 例如,* * * * *cronjob 将每分钟运行一次。使用 systemd .services,您可以使用 .timer 单元实现相同目的:

# foo.timer
[Unit]
Description=Do whatever

[Timer]
OnActiveSec=60
OnUnitActiveSec=60

[Install]
WantedBy=timers.target

然后,您不再启动 .service,而是启动 .timer,它会定期尝试自行启动 .service。

相关内容