![백그라운드에서 파이프라인 bash 스크립트 실행](https://linux55.com/image/21839/%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C%EC%97%90%EC%84%9C%20%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8%20bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%20%EC%8B%A4%ED%96%89.png)
netcat을 사용하여 로컬 호스트 통신을 모니터링하는 모니터링 스크립트를 작성하려고 합니다. 저는 두 개의 스크립트를 작성했습니다. 하나는 감시 루프를 시작하기 위한 것이고 다른 하나는 루프 자체를 위한 것입니다. 그것들은 다음과 같습니다:
시작 파일
#!/bin/bash
netcat localhost 1099 | bash loop.sh &
루프 문
#!/bin/bash
while read sInput; do
...do something with $sInput
done
포그라운드 없이 이 앱을 실행하는 것만으로도 문제가 없지만 백그라운드에서 이 스크립트를 실행하려고 하면 즉시 실행이 중단됩니다. 이런 일이 발생하는 이유와 이 문제를 완화하는 방법을 알려줄 수 있는 사람이 있습니까?
나의 궁극적인 목표는 아치 리눅스 데몬 스크립트를 생성하고 모든 것이 완벽하게 실행되도록 하는 데 사용할 수 있는 bash 스크립트를 갖는 것입니다. 당신의 도움을 주셔서 감사합니다.
답변1
표준 입력(stdin)에서 읽는 것 같습니다. -d
(표준 입력에서 읽으려고 시도하지 않음) 옵션을 에 추가 하거나 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}'