프로세스 출력이 리디렉션되는 위치 확인

프로세스 출력이 리디렉션되는 위치 확인

출력을 output.txt로 리디렉션해야 하는 프로세스가 있습니다. 불행히도 출력은 파일로 전송되지 않습니다. 먼저 다른 디렉터리에서 호출되었는지 확인했지만 출력이 가야 할 위치 외에는 output.txt가 없습니다. 그래서 출력을 확인한 sudo tail -f /proc/2027/fd/1결과 프로세스가 제대로 실행되고 있고 유효한 출력이 있음을 확인했습니다. 또한 프로세스가 이미 작동하고 아무것도 변경하지 않았기 때문에 프로세스를 올바르게 시작하고 있다고 확신합니다. 이제 내 질문은 이 프로세스의 출력이 어디로 가는가입니다. 다음과 같은 출력을 보는 솔루션만 찾을 수 있습니다.다른 bash 세션에서 실행 중인 프로세스의 출력을 어떻게 볼 수 있나요?. 하지만 출력이 어디로 리디렉션되는지 확인하고 싶습니다. 완전성을 위해 Java에서 프로세스를 시작하는 방법은 다음과 같습니다.

ProcessBuilder builder = new ProcessBuilder("java", "-jar", "variobox.jar");
builder.redirectOutput(new File("out.txt"));
builder.redirectError(new File ("error.txt"));
builder.start();

답변1

보시 다시피 /proc/$pid/fd/1stdout으로 전송된 출력이 표시됩니다. 하지만 보세요지금부터표준 출력이 전송되고 있으므로 심볼릭 링크의 대상만 보면 됩니다.

$ sleep 20 & pid=$!
[1] 88972
$ readlink -f /proc/$pid/fd/1
/dev/pty0
$  sleep 20 > /dev/null & pid=$!
[1] 99996
readlink -f /proc/$pid/fd/1
/dev/null

링크의 대상이 파이프이고 다른 쪽 끝에 무엇이 있는지 찾으려면 다음을 참조하세요.유닉스 파이프 반대편의 프로세스 이름은 무엇입니까?. 링크의 대상이 소켓이고 다른 쪽 끝에 무엇이 있는지 찾으려면 다음을 참조하세요.이 유닉스 소켓 쌍의 반대쪽 끝을 갖고 있는 사람이 있나요?.

그러나 표시되는 출력이 파일로 전송되는 출력이 아닌 경우 output.txt표시되는 출력은 다음과 같습니다.아니요실제로 출력됩니다(또는 더 구체적으로 표준 출력이 아님). 아마도 파일 설명자인 표준 오류일 것입니다 2.

답변2

이식 가능하게는 다음을 사용할 수 있습니다.

lsof -ad 1 -p "$pid"

id 프로세스의 fd 1(stdout)에 무엇이 열려 있는지 확인합니다 $pid.

파이프나 다른 프로세스 간 통신 채널에 열려 있는 경우 Linux에서는 -E반대편의 프로세스를 볼 수 있는 옵션을 추가할 수 있습니다.

관련 정보