/usr/에서 스크립트를 호출하는 일회성 서비스가 있습니다.
이것은 내 .service 파일입니다.
[Unit]
Description = Start apps
After = network.target
[Service]
Type=simple
ExecStart=/usr/start_apps.sh
[Install]
WantedBy=multi-user.target
내 스크립트는 비슷한 작업을 수행합니다.
cd /home/user/apps
# Run apps one at a time in background
./app1 &
./app2 &
이제 이 응용프로그램을 실행하려고 시도하는 것 같지만 실행하면 pgrep app
아무것도 실행되지 않습니다.
그래서 서비스가 종료되었기 때문인 것 같아요. 그래서 저는 다른 접근 방식을 시도했습니다.
cd /home/user/apps
# Run app1 in back ground
./app1 &
# Run app2 in forground so the service does not stop
./app2
이제 이것이 작동합니다(pgrep는 응용 프로그램이 실행 중임을 보여줍니다). 그러나 서비스를 시작할 때 결코 반환되지 않습니다. Ctrl+C를 수행한 다음 bash 프롬프트로 돌아갈 수 있고 응용 프로그램은 모두 여전히 실행 중입니다.
내가 원하는 것은 서비스를 시작하고 두 응용 프로그램을 모두 실행한 다음 명령줄로 돌아가서 다음을 수행하는 것입니다.
systemctl start my-service.service
이를 수행하는 가장 좋은 방법은 무엇입니까?
고쳐 쓰다다음과 같이 서비스를 설치하고 있습니다.
systemctl stop my-service.service
... copy the service/script files in place...
systemctl daemon-reload
systemctl enable my-service.service
systemctl start my-service.service
확실하지는 않지만...관련이 있을 수 있나요?
답변1
백그라운드에서 모든 프로세스를 시작하면 작동하지만 특히 중요할 수 있으므로 Type=forking
더 많은 옵션을 사용해야 하고 사용해야 할 수도 있습니다 .RemainAfterExit=yes
rc.local
이 사용 사례는 다음을 통해 systemd에서 처리되는 스크립트 처리 와 유사합니다 .이 장치의 템플릿이므로 다음 옵션을 모두 사용하는 것이 좋습니다.
[Service]
Type=forking
ExecStart=/usr/start_apps.sh
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no
왜 차단되고 포그라운드의 마지막 프로세스에서 Ctrl+C를 눌러야 하는지 모르겠습니다... systemctl start
명령 자체에서 Ctrl+C를 눌러야 합니까? 좀 이상하다고 할까요...
이러한 방식으로 응용 프로그램을 시작하는 것은(대부분 백그라운드에서, 스크립트에서) systemd의 실제 목적이 아니며 일부 기능을 놓칠 수 있습니다. 예를 들어 systemctl stop
또는 systemctl restart
해당 장치에서는 전혀 작동하지 않을 가능성이 높습니다.
백그라운드에서 애플리케이션을 실행하는 것은 요즘 "해킹"으로 간주됩니다(systemd뿐만 아니라 많은 이전 서비스 관리자 및 대부분의 다른 최신 서비스 관리자도 마찬가지입니다.) systemd는 여전히 이 작업을 수행할 수 있지만 이는 주로 이전 버전과의 호환성 및 더 나은 대안이 존재하는 경우에는 사용할 수 없습니다.
내 제안은 각 애플리케이션에 대해 별도의 서비스를 생성하거나 동일한 프로세스의 여러 인스턴스를 시작하려는 경우 템플릿 단위를 사용하는 것입니다. 또한 올바른 순서로 시작하고 중지하도록 장치 간의 종속성을 지정하는 지시어를 살펴보세요. 특히, 보세요PartOf=
지시문: 서비스 세트를 하나의 단위로 관리하고 단일 명령을 사용하여 서비스를 시작, 중지 또는 다시 시작할 수 있습니다.
답변2
이러한 애플리케이션이 충돌할 가능성이 있어 다시 시작해야 하거나 개별적으로 중지하거나 다시 시작해야 하는 경우 확인을 고려하세요.감독자 제어.
supervisorctl
일류 서비스로 systemd를 시작한 다음 원하는 수의 종속 프로세스를 시작하고 관리하도록 하여 서비스( , )를 시작하거나 중지할 수 있는 위치와 systemd supervisorctl stop all
( supervisorctl start all
)와 supervisorctl status myapp
유사한 감사 기능을 제공할 수 있습니다.
Supervisorctl에 대한 문서는 매우 훌륭하며, 게시한 것과 같은 간단한 쉘 스크립트로는 큰 어려움 없이 이 작업을 수행하는 데 충분하지 않을 수 있는 사용 사례인 것 같습니다.