오래된 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 사용자의 작업이 허용되지 않는 상황이 발생합니다. 루트로 실행할 수 있도록 sqlrelay 사용자를 제거하면 "유닛이 실패 상태로 들어갔습니다" 오류가 발생합니다.
답변1
Bash 스크립트에 넣고 ExecStart에서 스크립트를 호출하여 문제를 해결했습니다. 여기서 문제는 파이프 명령을 ExecStart와 함께 직접 사용해서는 안 된다는 것입니다. 서브쉘을 사용해야 합니다
예:
ExecStart=/bin/sh -c 'ps -eo ...| ....|.. '