古いsqlrelay接続サービスをすべて再起動するためにsystemd.timerを使用しようとしています。 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ユーザーの操作が許可されていない状況が発生します。 rootとして実行できるようにsqlrelayユーザーを削除すると、「ユニットが障害状態に入りました」というエラーが発生します。
答え1
Bashスクリプトに入れてExecStartからスクリプトを呼び出して問題を解決しました。ここでの問題は、パイプコマンドをExecStartで直接使用しないでください。サブシェルを使用する必要があります
例:
ExecStart=/bin/sh -c 'ps -eo ...| ....|.. '
答え2
ExecStart
.INI ファイルのキー値シェルスクリプトではありません。
追加読書
- Lennart Petlinget al。 (2019). 」コマンドライン」。 システムサービス。システムのマニュアルページ。