프로세스로 출력을 보내는 쉘 스크립트를 작성하는 방법


11

현재 서버 콘솔 프로그램을 읽고 명령을 보내야하기 때문에 화면에서 서버 콘솔 프로그램을 실행하고 있습니다.

백그라운드에서 데몬으로 앱을 실행하고 싶습니다 (init로 시작 / 중지).

tail -f로그를 만들 수 는 있지만 프로세스에 입력을 보낼 수는 없습니다.

입력을 읽고 보낼 수 있지만 백그라운드에서 계속 실행할 수 있도록 이것을 설정하는 방법이 있습니까?

또한 다른 프로세스 (예 : "Stop \ n"명령을 보낼 수있는 쉘 스크립트)에서 데몬으로 입력을 보내려고합니다.


이 글을 읽으려는 사람에게 한마디 만하시면됩니다. 명명 된 파이프에 대해 모른다면 적어도 한번 시도해 보는 것이 좋습니다. 이것을 사용하여 Minecraft를 서비스로 실행하고 명명 된 파이프에 쓰면 다른 스크립트에서 콘솔과 상호 작용할 수 있습니다. 그래서 출력 로그를 구문 분석하는 동안 서버를 중지하고 사용자에게 메시지를 보내는 스크립트를 작성할 수 있습니다 키 라인을 찾으려면 (예 : 사용자에게 문자 메시지로 채팅 메시지 보내기)
Bill K

답변:


9

파이프에서 읽고 파일에 쓰기

데몬이 임의의 프로세스에서 생성 된 입력을 읽으려면 해당 프로세스를 파이프에 연결해야합니다. 여기서 임의의 프로세스는 명령을 에코하는 것이며 다른 컨텍스트에서 실행됩니다. 따라서 명명 된 파이프를 작성하십시오 (종종 유닉스 컨텍스트에서 fifo라고 함).

mkfifo /var/run/daemon.fifo
</var/run/daemon.fifo /path/to/daemond --option >daemon.log

파이프에 명령을 작성하십시오.

echo 'FORWARD 10' >/var/run/daemon.fifo
echo 'LEFT 72' >/var/run/daemon.fifo

그러나 이것은 표준 입력에서 파일 끝을 볼 때 데몬이 종료 될 가능성이 높으며, 이는 파이프에 쓰는 첫 번째 프로세스가 종료되는 즉시 발생합니다. tail -f그 문제를 피하기 위해 사용할 수 있습니다 .

</var/run/daemon.fifo tail -c +1 -f | {
  echo $$ >/var/run/daemon.pid
  exec /path/to/daemond --option >daemon.log
}

일부 tail구현에서는 버퍼링으로 물릴 수 있습니다. tail프로세스는 출력을 생성하기에 충분한 바이트를 축적 할 때까지 기다립니다. POSIX 도구 상자에서이 문제를 해결할 수 있다고 생각하지 않습니다. 그것이 문제라면 사소한 C 또는 Perl 또는 Python 프로그램을 사용하십시오. 내가 말할 수있는 tail한 GNU coreutils (Linux 및 다른 곳에서 찾을 수 있음)는이 점에서 안전합니다.

데몬을 중지 echo >/var/run/daemon.fifo하면 tail프로세스가 종료됩니다.


화면 내에서 프로그램 시작

서비스 관리자에서 데몬을 직접 호출하는 대신 실제로 SysV init 또는 래퍼 스크립트 또는 Upstart와 같은 추가 기능을 사용하고 있습니까?

screen -c daemon.screenrc -L -d -m -S daemon_name /path/to/daemond --option

데몬은 서비스 관리자의 하위 프로세스가 아니므로 올바른 프로세스에 신호를 보내야합니다. 이를 수행하는 방법은 데몬이 시작되는 방식과 방법에 따라 다릅니다.

그건 기술적으로 가능 터미널로 실행중인 프로세스를 연결하지만,이 프로덕션 시스템에서 확실히 있도록 프로그램을 충돌거야 위험이있다.

-L옵션은 화면에 창에 나타나는 모든 것을 파일로 작성합니다. 파일 이름은 지시문 daemon.screenrc과 함께 제공됩니다 logfile.


실제로 스크립트에서 메시지를 보낼 수 있기를 원합니다. 아마도 내가 물어봐야 할 질문 일 것입니다. 현재 스크립트에서 서버를 실행하고 있으며 터미널에서 서버에 입력 할 수 있지만 서비스로 실행되고있는 것 같습니다.
Bill K

@Bill : 알겠습니다. 그런 다음 가장 먼저 떠오르는 것은 명명 된 파이프입니다.
Gilles 'SO- 악마 그만'12

나는 이것이 내가 원하는 @Gilles라고 생각합니다! 그래도 더 잘 이해해야합니다. 나는 그것을 이해하기 위해 매뉴얼 페이지를 정렬하는 데 약간의 시간을 할 것입니다. 나는 솔직히 거의 그것을 얻지 못합니다. 내 이론은 프로세스에 직접 연결하는 것이 아니라 원래 콘솔이 실행되는 것처럼 보이도록 deamons o / i에 대한 다른 스크립트를 작성하는 것입니다. 동시에 다른 스크립트에서 에코 'FORWARD 10'을 수행합니다.
Bill K

나는 그것을 많이 얻는 것 같아요. 내가 분해하면 이제 "mkfifo pipe"와 "tail -f pipe | command> output"을 이해하고 테스트하여 작동합니다. 나는 당신이 가진 다른 것들의 대부분이 한 줄에서 실행되도록하는 트릭이라고 생각합니다. 중요한 것이 빠졌습니까?
Bill K

@Bill : 화면 stuff명령을 사용하여 외부에서 화면 내부의 터미널에 쓸 수 있습니다. 그러나 여기에서는 터미널의 오버 헤드 (처리, 그러나 가장 중요한 인식)가 필요하지 않습니다. 파이프는 거의 충분합니다 (파일 끝 무시 무시 릴레이 프로세스로는 충분합니다). 한 터미널과 다른 터미널에서 <fifo cat또는 다른 터미널 <fifo tail -f | cat에서 조금 실험 해 볼 수 있습니다 echo >fifo; echo >fifo. 난 괜찮을 것 같아
Gilles 'SO- 악마 그만해
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.