systemd 서비스에서 호출할 때 bash 스크립트의 "route add/del"이 작동하지 않습니다.

systemd 서비스에서 호출할 때 bash 스크립트의 "route add/del"이 작동하지 않습니다.

라우팅 명령을 사용하여 네트워크 경로를 추가하거나 제거하는 스크립트가 있습니다. 터미널에서 일반 스크립트로 실행하면 제대로 작동합니다.

그러나 시스템화된 일회성 서비스를 사용하여 시작 시 실행되도록 자동화하려고 했습니다.

서비스를 만들었고 모든 것이 잘 돌아가고 있는 것 같습니다. 어디에도 불만이 없고 어디에서나 관찰할 수 있는 오류 코드나 메시지는 없지만 경로는 추가되거나 제거되지 않습니다.

"route add/del"을 실행할 때 systemd가 일종의 제한을 부과하는 것 같지만 그것이 무엇인지 알 수 없습니다.

CentOS 7을 사용하고 있어서 ExecStart, ExecStop에 "+"를 추가할 수 없습니다.

KillMode=None(스크립트 내에서 분기를 허용하기 위해 권장되지 않음)을 설정해 보았지만 도움이 되지 않았습니다.

경로만 추가/제거하는 스크립트 버전을 만들었습니다. 테스트 목적으로 스크립트를 거의 한 줄로 줄였습니다. "route add"/"route del"을 수행하여 문제를 해결했습니다. 문제는 100%라고 말할 수 있습니다. 스크립트의 다른 항목 대신 "route add/del"을 실행하면 systemd가 실행됩니다.

어떻게 진행해야 할지 모르겠습니다. 누군가 통찰력이나 디버깅 방법을 제공할 수 있다면 좋을 것입니다.

내 서비스 정의는 다음과 같습니다. 특별한 것은 없습니다.

[Unit]
Description=Add/remove network X
After=network-online.target

[Service]
Type=oneshot
KillMode=none
ExecStart=/usr/local/bin/script.sh --start
ExecStop=/usr/local/bin/script.sh --stop

[Install]
WantedBy=multi-user.target

참고: "systemd-networkd"가 네트워크 경로를 생성할 수 있다는 것을 알고 있지만 해당 스크립트는 단순히 네트워크 경로를 추가하거나 제거하는 것 이상의 기능을 수행하므로 이는 내가 원하는 것이 아닙니다.

답변1

좋아, 문제를 발견했습니다. 서비스 유형이 일회성인 경우 추가해야 합니다. 그렇지 않으면 실행할 RemainAfterExit=yes때 발생하는 것처럼 보이는 것이 실행 systemctl start <service>됩니다 . 스크립트는 잘 작동하며 경로 추가를 사용한 다음 .ExecStartExecStopExecStartExecStop

RemainAfterExit=yes서비스의 사용 사례는 시스템 상태를 변경하는 것이므로 내 사용 사례에 사용하는 것이 합리적입니다 .systemd 문서에 명시된 바와 같이.

그러나 when 이후에 실행되는 이 동작이 버그인지 CentOS7의 예상 동작인지는 알 수 없습니다 ExecStop. Systemd 문서에서 자세한 설명을 찾을 수 없었습니다(또는 놓쳤을 수도 있습니다).ExecStartRemainAfterExit=no

관련 정보