출력을 로그 파일로 리디렉션하는 동시에 프로세스를 백그라운드에 둘 수 있나요?

출력을 로그 파일로 리디렉션하는 동시에 프로세스를 백그라운드에 둘 수 있나요?

출력을 로그 파일과 백그라운드 프로세스로 동시에 리디렉션할 수 있나요?

즉, 이런 일을 할 수 있습니까?

nohup java -jar myProgram.jar 2>&1 > output.log &

아니면 이것은 법적 명령이 아닌가? 아니면 다음과 같이 수동으로 배경으로 이동해야 합니까?

java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1

답변1

첫 번째 명령의 한 가지 문제점은 stderr를 stdout이 있는 위치로 리디렉션한 다음(설명에서 제안한 대로 $를 &로 변경한 경우) stdout을 일부 로그 파일로 리디렉션하지만 리디렉션된 stderr을 가져오지는 않는다는 것입니다. 다른 순서로 이 작업을 수행해야 합니다. 먼저 stdout을 원하는 위치로 보낸 다음 stdout이 있는 주소로 stderr을 보냅니다.

some_cmd > some_file 2>&1 &

그런 다음 &를 추가하여 배경으로 보낼 수 있습니다. 명령을 사용하여 작업에 액세스할 수 있습니다 jobs. jobs실행 중인 작업이 표시되고 번호가 매겨집니다. 그런 다음 % 다음에 비슷한 숫자를 사용하여 일에 대해 말할 수 있습니다 kill %1.

또한 끝에 &가 없으면 일시 중지 명령을 사용하여 Ctrlz배경 bg에 놓고 fg다시 전경으로 가져올 수 있습니다. 명령 과 결합하여 jobs이 기능은 매우 강력합니다.

명령이 작성되는 순서에 대해 위 섹션을 명확히 하세요. stderr은 주소 1002, stdout은 주소 1001, 파일은 1008이라고 가정합니다. 명령은 왼쪽에서 오른쪽으로 읽으므로 명령에서 가장 먼저 보는 것은 2>&1stderr를 주소 1001로 이동하는 것입니다. 그런 다음 > filestdout을 1008로 이동하지만 stderr을 1001로 유지하는 것을 확인합니다. 1001을 가리키는 모든 것을 꺼내어 1008로 이동하는 것이 아니라 단지 stdout을 참조하여 파일로 이동합니다.
대신 stdout을 1008로 이동한 다음 stderr을 stdout이 가리키는 지점인 1008로 이동합니다. 이렇게 하면 둘 다 단일 파일을 가리킬 수 있습니다.

답변2

java -jar myProgram.jar &> output.log &

stdout 및 stderr 은 &>output.log로 전달됩니다.

답변3

<Ctrl+Z>백그라운드에서 중지 하고 계속하는 것은 명령 끝에서 실행하는 것과 bg같습니다 .&

따라서 백그라운드에서 실행하고 출력을 리디렉션하려면 다음을 수행하십시오.

java -jar myProgram.jar 2> errorOutput.log > output.log &

터미널을 떠날 때 사라지지 않도록 하는 명령도 필요한 경우 다음을 사용해야 합니다.nohup

답변4

nohup 대신 screen을 사용할 수 있습니다. 실시간으로 프로그램 진행 상황을 확인할 수 있습니다. 모든 출력을 파일에 기록할 수도 있습니다. SSH를 통해 서버에 접속했다가 연결 상태가 좋지 않거나 활동이 없어 로그아웃할 때 유용합니다. 로그인한 후에는 중단한 부분부터 계속 작업할 수 있습니다. 인용하다이것그리고이것더 알아보기.

관련 정보