백그라운드에서 파이프된 bash 스크립트 실행

백그라운드에서 파이프된 bash 스크립트 실행

netcat을 사용하여 로컬 호스트 통신을 감시하는 모니터링 스크립트를 작성하려고 합니다. 저는 두 개의 스크립트를 작성했습니다. 하나는 모니터링 루프를 시작하기 위한 것이고 다른 하나는 루프 자체를 위한 것입니다. 그것들은 다음과 같습니다:

start.sh

#!/bin/bash
netcat localhost 1099  | bash loop.sh &

loop.sh

#!/bin/bash
while read sInput; do
     ...do something with $sInput
done

단순히 포그라운드 없이 이 애플리케이션을 실행하면 잘 작동하지만, 이 스크립트를 백그라운드에서 실행하려고 하면 즉시 실행이 중단됩니다. 누군가 이런 일이 발생하는 이유와 문제를 완화하는 방법에 대해 알려주실 수 있습니까?

나의 최종 목표는 아치 리눅스 데몬 스크립트를 생성하고 모든 것이 완벽하게 작동하도록 할 수 있는 bash 스크립트를 갖는 것입니다. 귀하의 도움에 감사드립니다.

답변1

표준 입력(stdin)에서 읽는 것 같습니다. -d(Stdin에서 읽으려고 시도하지 않음) 옵션 을 netcat. 또는 명령줄에서 리디렉션:

netcat localhost 1099 <&- | bash loop.sh &

nohup또한 해당 쉘이 중지되기 전에 종료할 때 부정적인 영향을 받지 않는지 확인하기 위해 사용할 수도 있습니다 .

답변2

netcat 프로세스는 표준 입력을 읽고 있습니다. 터미널에 연결되어 있으므로 netcat이 속한 프로세스 그룹(예: 파이프라인)은 전경에서 실행되어야 합니다.

서버가 예상하는 입력을 보내는 파이프라인 시작 부분에 무언가를 연결해야 합니다. 예를 들어 HTTP 서버의 경우 다음과 같은 것이 있을 수 있습니다.

netcat localhost 1099 <<EOF | … &
GET HTTP/1.0 http://localhost:1099/somewhere
X-Header: wibble

EOF

서버가 입력을 읽지 못하는 경우 의 netcat입력을 에서 리디렉션합니다 /dev/null.

답변3

별도의 새로운 데몬화된 bash 스크립트가 필요 없이 파이프를 제공하는 유틸리티를 발견했습니다. 유용할 수 있습니다:https://github.com/flonatel/pipeexec

pipexec -- [NETCAT netcat localhost 1099]  [LOOP bash loop.sh] '{NETCAT:1>LOOP:0}'

관련 정보