
socat
원격 서버에서 실행되는 자세한 디버그 출력을 캡처해야 합니다 .
socat
포그라운드에서 실행할 때 위와 같은 결과를 얻을 수 있습니다 .
$ socat -x -d -d -d tcp-l:8080,bind=0.0.0.0,fork,reuseaddr - 2>stderr.log >stdout.log
하지만,stdout.log
위의 내용이 nohup
백그라운드에서 실행 되면 출력이 수신되지 않습니다.:
$ nohup socat -x -d -d -d tcp-l:8080,bind=0.0.0.0,fork,reuseaddr - 2>stderr.log >stdout.log &
위 버전 stderr.log
을 시작한 직후의 모습은 다음과 같습니다 .nohup
socat
nohup: ignoring input
2024/03/24 20:06:22 socat[28360] I socat by Gerhard Rieger and contributors - see www.dest-unreach.org
2024/03/24 20:06:22 socat[28360] I This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit. (http://www.openssl.org/)
2024/03/24 20:06:22 socat[28360] I This product includes software written by Tim Hudson ([email protected])
2024/03/24 20:06:22 socat[28360] I setting option "bind" to "0.0.0.0"
2024/03/24 20:06:22 socat[28360] I setting option "fork" to 1
2024/03/24 20:06:22 socat[28360] I setting option "so-reuseaddr" to 1
2024/03/24 20:06:22 socat[28360] I socket(2, 1, 6) -> 5
2024/03/24 20:06:22 socat[28360] W ioctl(5, IOCTL_VM_SOCKETS_GET_LOCAL_CID, ...): Inappropriate ioctl for device
2024/03/24 20:06:22 socat[28360] I starting accept loop
2024/03/24 20:06:22 socat[28360] N listening on AF=2 0.0.0.0:8080
8080
다음으로 netcat에서 포트에 연결합니다 .
$ nc localhost 8080
그리고 이것이 stderr.log
다음을 포착하는 것입니다:
2024/03/24 20:06:59 socat[28360] I accept(5, {2, AF=2 127.0.0.1:37910}, 16) -> 6
2024/03/24 20:06:59 socat[28360] N accepting connection from AF=2 127.0.0.1:37910 on AF=2 127.0.0.1:8080
2024/03/24 20:06:59 socat[28360] I permitting connection from AF=2 127.0.0.1:37910
2024/03/24 20:06:59 socat[28360] N forked off child process 28563
2024/03/24 20:06:59 socat[28360] I close(6)
2024/03/24 20:06:59 socat[28360] I still listening
2024/03/24 20:06:59 socat[28360] N listening on AF=2 0.0.0.0:8080
2024/03/24 20:06:59 socat[28563] I just born: child process 28563
2024/03/24 20:06:59 socat[28563] I close(4)
2024/03/24 20:06:59 socat[28563] I close(3)
2024/03/24 20:06:59 socat[28563] I just born: child process 28563
2024/03/24 20:06:59 socat[28563] I close(5)
2024/03/24 20:06:59 socat[28563] N reading from and writing to stdio
2024/03/24 20:06:59 socat[28563] I resolved and opened all sock addresses
2024/03/24 20:06:59 socat[28563] N starting data transfer loop with FDs [6,6] and [0,1]
2024/03/24 20:06:59 socat[28563] E read(0, 0x60485184f000, 8192): Bad file descriptor
2024/03/24 20:06:59 socat[28563] N exit(1)
2024/03/24 20:06:59 socat[28563] I shutdown(6, 2)
2024/03/24 20:06:59 socat[28360] N childdied(): handling signal 17
2024/03/24 20:06:59 socat[28360] I childdied(signum=17)
2024/03/24 20:06:59 socat[28360] I childdied(17): cannot identify child 28563
2024/03/24 20:06:59 socat[28360] I waitpid(): child 28563 exited with status 1
2024/03/24 20:06:59 socat[28360] I waitpid(-1, {}, WNOHANG): No child processes
2024/03/24 20:06:59 socat[28360] I childdied() finished
다음으로 netcat 터미널에 텍스트를 입력하고 Enter 키를 누릅니다.
그러나 문제는 다음과 같습니다.netcat이 종료될 뿐만 아니라 내가 입력한 텍스트 stdout.log
도 표시되지 않습니다..
여기서 무슨 일이 일어나고 있는지 밝히는 것 외에도 누군가 nohup
'ed '의 stderr 및 stdout을 캡처하는 방법을 친절하게 제안할 수 있습니까 socat
? 기본적으로 원격 소켓 클라이언트 -v
가 .-d -d -d
stderr.log
stdout.log
답변1
설명
의 stdin에 관한 것입니다 socat
.
를 사용하여 백그라운드에서 명령을 실행하는 경우 &
기본적으로 두 가지 가능성이 있습니다.
셸에서 작업 제어가 비활성화된 경우(스크립트의 기본값) 명령의 stdin은 명시적인 리디렉션이 수행되기 전에
/dev/null
또는 동등한 파일로 리디렉션됩니다.셸에서 작업 제어가 활성화된 경우(대화식 사용 시 기본값) 명령의 stdin이 예상한 것이므로 터미널일 수 있습니다. 터미널인 경우 백그라운드 명령은 터미널에서 입력을 훔칠 수 없습니다. 시도하면 SIGTTIN을 받게 됩니다. 여전히 다음을 사용하여 명령을 전경으로 가져올 수 있습니다
fg
.그 다음에터미널에서 읽을 수 있습니다.
nohup
자체적으로 표준 스트림을 터미널에서 멀리 리디렉션하므로 후자의 경우에도 socat
백그라운드 또는 해당 하위/스레드/무엇이든 stdin에서 읽으려고 시도하면 즉시 EOF 조건(또는 일부 오류)이 발생합니다.
like 를 사용하여 데이터를 빠르게 전달할 수 있어야 하며 echo message | nc localhost 8080
, socat
이 특정 연결을 처리하면 stdin의 EOF로 인해 종료되기 전에 메시지를 받아야 합니다.
해결책
의 stdin에 대한 EOF로 인해 연결이 종료되는 것을 원하지 않으면 socat
도구에 이 주소에서 읽지 않도록 지시하십시오. 에서 man 1 socat
:
-u
단방향 모드를 사용합니다. 첫 번째 주소는 읽기에만 사용되고, 두 번째 주소는 [...] 쓰기에만 사용됩니다.
-U
역방향에서는 단방향 모드를 사용합니다. 첫 번째 주소는 쓰기에만 사용되고 두 번째 주소는 읽기에만 사용됩니다.
귀하의 경우 -
(의미 STDIO
)는 두 번째 주소이므로 다음이 필요합니다 -u
.
nohup socat -u -x -d -d -d tcp-l:8080,bind=0.0.0.0,fork,reuseaddr - 2>stderr.log >stdout.log &