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}'