进一步阅读

进一步阅读

我正在尝试使用 systemd.timer 重新启动所有过时的 sqlrelay 连接服务。 Systemd 服务如下所示:

[Unit]
Description=sqlrelay-state-connection-restart

[Service]
Type=oneshot
User=sqlrelay
ExecStart=/bin/ps -eo pid,etimes,cmd  | /bin/awk '$2 >=100 && $3=="sqlr-connection"  {printf "sqlrelay@%s.target\n", $9}' | /usr/bin/sudo /bin/xargs -r /bin/systemctl restart

定时器:

[Timer]
OnCalendar=*-*-* *:0/5:0

[Install]
WantedBy=timers.target

我在 sudoers 文件中添加了带有 Nopasswd 的 sqlrelay 用户。

计时器正常启动,没有任何错误。但有了服务,它就没有加载。在日志中我看到这个:

Apr 23 23:10:00 ****.com systemd[1]: sqlrelay-stale-restart.service failed to run 'start' task: Operation not supported
Apr 23 23:10:00 ****.com systemd[1]: Failed to start sqlrelay-state-connection-restart.
Apr 23 23:15:00 ****.com systemd[1]: sqlrelay-stale-restart.service: main process exited, code=exited, status=1/FAILURE
Apr 23 23:15:00 ****.com systemd[1]: Failed to start sqlrelay-state-connection-restart.
Apr 23 23:15:00 ****.com systemd[1]: Unit sqlrelay-stale-restart.service entered failed state.
Apr 23 23:15:00 ****.com systemd[1]: sqlrelay-stale-restart.service failed.

有时我会遇到不允许 sqlrelay 用户进行操作的情况。如果我删除 sqlrelay 用户,以允许它以 root 身份运行,我会收到“单元进入失败状态”错误

答案1

我通过将它们放入 Bash 脚本并从 ExecStart 调用该脚本来修复它。这里的问题是管道命令不应该直接与 ExecStart 一起使用。我们必须使用子shell

例子:

ExecStart=/bin/sh -c 'ps -eo ...| ....|.. '

答案2

ExecStart.INI 文件中键的值不是 shell 脚本

进一步阅读

  • 伦纳特·珀特林等人。 (2019)。 ”命令行”。 系统服务。 systemd 手册页。

相关内容