출력을 프로세스로 보내는 쉘 스크립트를 만드는 방법

출력을 프로세스로 보내는 쉘 스크립트를 만드는 방법

현재 화면에서 서버 콘솔 프로그램을 실행하고 있는데 가끔씩 읽어보고 명령을 보내야 하기 때문입니다.

애플리케이션을 백그라운드에서 데몬으로 실행하고 싶습니다(init를 사용하여 시작/중지).

기록 할 수는 있지만 tail -f프로세스에 입력을 보낼 수는 없습니다.

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

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

답변1

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

데몬이 임의 프로세스에 의해 생성된 입력을 읽도록 하려면 해당 프로세스를 파이프에 연결해야 합니다. 여기서 임의 프로세스는 echo 명령이며 다른 컨텍스트에서 실행됩니다. 그래서명명된 파이프(UNIX 환경에서는 일반적으로 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 프로그램을 사용하십시오. 내가 아는 한, tailGNU 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옵션을 사용하면 Screen이 창에 나타나는 모든 내용을 파일에 기록하게 됩니다. 파일 이름은 daemon.screenrc지시어에 나와 있습니다 logfile.

관련 정보