사용자로서 일부 서비스 프로세스를 시작하고 깨끗하고 쉬운 시작 중지를 위해 모든 서비스 프로세스를 중단할 수 있는 임시 사례가 있습니다. "docker-compose up"의 동작은 내가 원하는 것과 비슷합니다. 모든 stdout/stderr 피드는 호출 셸의 stdout/stderr에 도착하고 sigint는 모든 프로세스를 함께 종료합니다.
나는 supervisord와 circus를 시도했지만 둘 다 너무 생산 중심적이어서 표준 스트림에 참여하고 포그라운드에 머물며 일반적으로 포그라운드 프로세스처럼 작동하지 않는 해결 방법이 필요합니다. 나는 이것을 하기 위한 좋은 도구가 있다고 확신합니다. 나는 그것이 일반 쉘에서 수행되는 것을 보았습니다. 차라리 그것을 피하고 싶지만 상용구가 너무 극단적이지 않은 경우에는 옵션입니다.
이 결과는 Google "Overlord"에 표시됩니다.https://github.com/dpedu/overlord동일한 목표와 문제에 대해 이야기하지만 여기에는 절차가 표시되지 않습니다.
범용 언어의 경우 foo, bar 및 baz를 실행하고 stdout/error를 병합한 다음 sigint가 발생할 때까지 대기하고 싶다고 가정해 보겠습니다. sigint는 세 프로그램 각각에 sigint를 보낸 다음 각 프로그램을 기다립니다. 나가기 위해서. 다시 말하지만, 이 작업을 셸에서 수행해야 한다면 괜찮습니다. 하지만 개발자 흐름 구성 도구(docker-compose, docker, init 또는 컨테이너 중심 도구 제외)가 있는지 알고 싶습니다. 그러한 작업을 위해 특별히
추가 보너스 기능은 tty 정보를 보존하여 하위 프로세스가 자동 색상을 활성화할 수 있지만 큰 문제는 아닙니다.
#!/bin/sh
./foo &
./bar &
./baz &
이 글을 쓰다가 우연히 알게 된
https://github.com/Yelp/dumb-init
멍청한 초기화는 실제로 제가 찾고 싶었던 것과 거의 같습니다. 이미 데비안에 패키지되어 있고 해당 구성 파일은 가벼운 쉘 파일입니다.
#!/usr/bin/dumb-init /bin/sh ./foo & # launch a process in the background ./bar & ./baz # launch another process in the foreground
답변1
멍청한 초기화
https://github.com/Yelp/dumb-init
- 데비안에 패키지됨(apt install dump-init)
구성 예: "./start"를 생성하고 이에 대한 콘텐츠를 지정합니다.
#!/usr/bin/dumb-init /bin/sh
./foo & # launch a process in the background
./bar &
./baz # launch another process in the foreground
평소처럼 ^C를 사용하여 chmod +x ./start
실행/종료하는 것을 잊지 마세요../start
답변2
, 및 가 모두 더 큰 것으로 시작되고 동일한 것으로 중지되는 systemd
솔루션을 사용할 수 있습니다 .foo.service
bar.service
baz.service
super.service
이렇게 하면 다음과 같은 이점이 있습니다.
- 이 장치 그룹이 오류에 대응하는 방법을 선택할 수 있습니다.
- 이를 위해 특별히 터미널 창을 설정할 필요는 없습니다(프로세스에 영향을 주지 않고 터미널을 닫을 수 있음).
- 터미널을 수동으로 스크롤하는 대신 도구를 사용하여 관심 있는 부분을 구문 분석할 수 있도록 로깅을 저장할 수 있습니다.
원하는 대로 이러한 프로세스를 전경에 유지하지는 않지만 프로세스가 대화형이 아닌 이상 전경에 유지하는 데 큰 가치가 없습니다.
이를 수행하는 파일 세트는 다음과 같습니다.
# ~/.config/systemd/user/super.service
[Unit]
Description=running everything
[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=yes
--------------------------------------------
# ~/.config/systemd/user/foo.service
[Unit]
PartOf=super.service
[Service]
ExecStart=%h/bin/foo
[Install]
WantedBy=super.service
--------------------------------------------
# ~/.config/systemd/user/bar.service
[Unit]
PartOf=super.service
[Service]
ExecStart=%h/bin/bar
[Install]
WantedBy=super.service
--------------------------------------------
# ~/.config/systemd/user/baz.service
[Unit]
PartOf=super.service
[Service]
ExecStart=%h/bin/baz
[Install]
WantedBy=super.service
설명하다:
WantedBy=super.service
super.service
시작할 때마다 이것도 시작된다는 의미입니다 .PartOf=super.service
중지 되면super.service
이것도 중지됨을 의미합니다.
제어:
super
그룹 에 각 장치 추가systemctl --user enable foo bar baz
- 모든 프로세스 시작
systemctl --user start super
- 모든 프로세스를 중지합니다.
systemctl --user stop super
- 동일한 창에서 모든 프로세스의 표준 출력을 보려면 다음 명령을 사용하십시오
journalctl -u foo -u bar -u baz
.-f
화면의 표준 출력을 계속 주시하려면 추가하십시오.
기타 참고사항:
KillSignal=SIGINT
정상적으로 중지되는 서비스에 추가하세요SIGINT
(그렇지 않으면SIGTERM
).foo
충돌이 발생하거나 시작에 실패 하면 다른 프로세스를 강제로 중지할 수 있습니다. 로 변경하면WantedBy=
됩니다RequiredBy=
. 시작하지 못하면super.service
정지되어 정지하게 됩니다.foo
bar
baz
- 어떤 이유로 든 (예: 자연적인 종료 또는 실패) 중지를
BindsTo=
유발하는 관계를 추가할 수도 있습니다 .super.service
foo
bar
baz
- 사용의 한 가지 이점
journalctl
은 장치가 시작/중지된 시간, 메시지를 인쇄한 프로세스 등의 메타데이터를 알려준다는 것입니다. 하지만 이 세부정보가 마음에 들지 않으면StandardOutput=append:%h/log
각[Service]
섹션에 추가하세요. 그러면 모든 로그가 입력됩니다~/log
. 그런 다음tail -f ~/log
시청할 수 있습니다. 이렇게 하면 색상도 더 잘 보존되는 것 같아요.
답변3
쉘 사용을 피하는 것을 선호한다고 말씀하셨는데, 그것이 바로 쉘의 목적입니다. 그렇지 않습니까?
Bash에서 많은 백그라운드 프로세스를 시작하려면 다음을 수행하면 됩니다.
./job1 & ./job2 & ./job3 &
그들 모두에게 INT 신호를 보냅니다:
kill -INT $(jobs -p)
이 모든 작업이 완료될 때까지 기다립니다.
wait
동일한 작업 세트를 반복적으로 실행하려는 것이 문제인 경우 다음을 설정할 수 있습니다.
alias start="./job1 & ./job2 & ./job3 &"
alias stop='kill -INT $(jobs -p); wait'
그런 다음 모두 죽이고 싶다면 start
모두 발사하도록 입력하면 됩니다.stop