터미널을 열 필요가 없는 "스크립트"와 유사한 것이 있습니까?
내 프로그램의 결과를 파일에 저장하고 싶지만 몇 가지 문제가 있습니다. 원격으로 작업해야 하는데 인터넷 연결이 좋지 않습니다. 그래서 나는 보통 다음을 실행합니다.
./MyProgram.exe > output.txt &
내 프로그램의 결과는 output.txt 파일에 저장됩니다.
그러나 특정 개체에서 프로그램을 실행하면 "SIGSEGV: Segmentation Fault" 오류가 발생합니다. 프로그램이 종료되었습니다. 괜찮습니다. 그렇게 될 것이라는 것을 알았습니다. 그러나 프로그램이 오류를 일으킨 문제가 있는 개체를 만나기 전에 이전 개체의 모든 데이터를 잃어버렸습니다.
모든 것(문제 개체가 없는 결과와 이 오류 포함)을 파일에 기록하려면 어떻게 해야 합니까?
나는 시도했다:
./MyProgram.exe > output.txt 2>&1 &
./MyProgram.exe > output.txt 2> error.txt &
./MyProgram.exe > & error-n-output.txt &
그러나 위의 모든 내용은 프로그램이 이전 개체에서 작동한다는 것을 알고 있음에도 불구하고 이전 개체의 결과가 아닌 분할 오류만 기록합니다.
script
또한 다음 명령을 입력 해 보았습니다 .
내이름@컴퓨터~/폴더 $script screen.log
스크립트가 시작되었으며 파일은 screen.log입니다.
내이름@컴퓨터~/폴더 $./MyProgram.exe
~~결과와 분할 오류가 화면에 인쇄되므로 특정 개체에 대한 결과를 기록하고 오류를 무시할 수 있습니다~~
내이름@컴퓨터~/폴더 $종료
종료
스크립트가 완료되고 파일은 screen.log입니다.
화면의 모든 내용은 screen.log 파일에 기록됩니다. 괜찮을 수도 있지만 인터넷 연결 상태가 좋지 않아 장시간 화면을 실행할 수 없습니다. 터미널을 종료해야 하지만 당연히 프로그램이 종료되고 "screen.log" 파일에 아무 것도 기록되지 않습니다.
script
터미널을 열 필요가 없는 비슷한 것이 있습니까 ?
답변1
nohup
어쩌면 그것이 당신이 원하는 것일 수도 있습니다. nohup
목적은 "명령을 실행하고 끊기 신호를 무시하는 것"입니다. 즉, 어떤 이유로든(물론 호스트 충돌, 종료 또는 재부팅 제외) 직렬 연결 등의 연결이 끊어져도 프로그램은 계속 실행됩니다 ssh
.telnet
모든 출력이 파일로 리디렉션되므로 nohup
백그라운드에서 (을 사용하여) -ed 명령을 실행할 수도 있습니다 .&
예를 들어:
nohup MyProgram.exe &
기본적으로 출력은 ./nohup.out
또는 에 저장되지만 ~/nohup.out
필요한 경우 다른 파일로 리디렉션할 수 있습니다. 매뉴얼 페이지에서:
표준 입력이 터미널인 경우 읽을 수 없는 파일에서 리디렉션하십시오. 표준 출력이 터미널인 경우
nohup.out
가능하면 출력을 추가하고,$HOME/nohup.out
그렇지 않으면 출력을 추가하세요. 표준 오류가 터미널인 경우 표준 출력으로 리디렉션합니다. 출력을 FILE에 저장하려면nohup COMMAND > FILE
.
nohup
사용자 입력이 필요하지 않은 비대화형 프로그램에 가장 적합합니다.
사용자와 직접 상호작용하는 프로그램(예: ncurses
애플리케이션)을 실행해야 하는 경우 GNU와 같은 터미널 멀티플렉서를 사용하세요.화면, 또는멀티플렉서, 또는화면또는 대신에 비슷한 것 nohup
.
터미널 멀티플렉서는 프로그램이 중단 신호에 영향을 받지 않도록 할 뿐만 아니라 연결을 끊은 후 다시 로그인할 때 동일한 셸 세션(및 실행 중인 프로그램)에 다시 연결할 수 있도록 해줍니다. 또한 단일 연결을 통해 여러 셸 세션을 활성화할 수 있습니다(예: ssh를 통해 원격 시스템에 연결하고 를 실행하면 screen
필요에 따라 원하는 수의 셸 "창"을 생성, 삭제 및 전환할 수 있습니다).
그런데 이들 프로그램은 모두 표준 쉘을 제공하므로 script
그 안에서 실행하도록 선택할 수 있습니다.
이 프로그램의 홈 페이지에 링크를 걸었지만 설치를 위해 컴파일할 필요는 없을 것입니다. 대부분의(모두?) Linux 배포판, FreeBSD, Mac OS X, Solaris 및 더.
답변2
표준 출력에 추가하려면 >>
다음 대신 사용할 수 있습니다 >
.
./MyProgram.exe >> output.txt 2> error.txt &
이렇게 하면 출력이 매번 덮어쓰이는 것을 방지할 수 있습니다.
이는 분명히 세션이 닫힐 때 프로세스가 종료되는 것을 방지하지 않습니다. 가능한 경우 nohup
이를 사용하여 프로그램을 시작해야 합니다. 이렇게 하면 세션이 닫혀도 프로그램이 계속 실행될 수 있습니다.
답변3
명령을 시도
stdbuf -oL ./MyProgram.exe > output.txt
기본적으로 프로그램의 표준 출력은 출력이 터미널인 경우 라인 버퍼링되지만 출력이 일반 파일인 경우 4kB 청크로 버퍼링됩니다(output.txt로 리디렉션했기 때문에 지금의 경우입니다).
이는 printf()와 같은 표준 stdio 함수가 실제로 데이터를 쓰기 전에 최대 4kB의 데이터를 수집한다는 의미입니다. 유틸리티가 충돌하면(안타깝지만) 아직 작성되지 않은 마지막 블록이 손실됩니다.
stdbuf -oL
출력이 일반 파일로 이동하더라도 표준 출력이 라인 버퍼링되도록 설정하십시오.
(의심할 여지 없이 가장 깔끔한 해결책은 애플리케이션이 충돌하지 않도록 수정하는 것입니다.)
nohup
이것을 또는 screen
다른 답변에 표시된 대로 추가로 결합할 수 있습니다 .
답변4
다음을 시도해 보세요.
program.exe &> /temp/output.log ;
# OR #
program.exe &> /temp/output.log &
경우에 따라 다음과 같은 변경 사항을 계속 주시하고 싶을 수도 있습니다.
watch cat /temp/output.log
# OR #
watch --diff cat /temp/output.log
또는 유사하게:
watch tail /temp/output.log
# OR #
watch --diff tail /temp/output.log
정확히 무엇을 원하는지 결정하는 것은 약간 어렵지만 다음 유틸리티가 유용할 수 있습니다.
script
# OR #
asciinema
다른 모든 방법이 실패하면 디버거, 디컴파일러, 디스어셈블러 등을 사용하는 것을 고려해야 합니다.
어떻게 지내는지 알려주시면 이에 따라 이 게시물을 조정하겠습니다.