다음과 같은 명명된 화면에서 프로세스를 시작합니다.
screen -dmS myscreen bash -c "export VAR=123; cd /usr/local/myproject; ./myscript.py"
그러나 몇 분 후에 스크립트가 충돌하고 종료되면 화면이 종료되므로 디버그 출력이 표시되지 않습니다. 내 스크립트는 화면에 수동으로 연결할 수 있을 만큼 충분히 오래 실행되지만 화면은 여전히 자동으로 종료되어 나를 쫓아냅니다.
실행 중인 프로세스가 중지될 때 화면이 종료되는 것을 방지하는 방법은 무엇입니까?
답변1
출력을 less
파일로 파이프한 tee
다음 파일로 파이프 less
하거나 sleep 99999
명령 뒤에 "pause" 명령을 추가할 수 있습니다.
screen -dmS myscreen bash -c "export VAR=123; cd /usr/local/myproject; ./myscript.py; sleep 9999"
어쨌든 에서 로 전환하는 것이 screen
좋습니다 tmux
.이것명령을 실행하고 종료한 후 유지하는 방법을 이해하기 위한 질문입니다.
bash -i
기본적으로 명령 끝에 추가할 수 있습니다 .
tmux start-server
tmux new-session -d
tmux new-window 'ls;bash -i'
아니면 당신은 사용할 수 있습니다이것옵션remain-on-exit
종료 시 보존 설정 [on |leave]
이 옵션이 true인 경우 실행 중인 프로그램이 종료된 창은 닫히지 않고 열려 있지만 비활성 상태로 유지됩니다.
답변2
기본적으로 screen
관찰한 대로 실행 중인 명령이 닫힐 때 종료됩니다. 단독으로 실행 하면 screen
실행되는 명령은 대화형 셸이며 물론 하위 항목이 종료될 때 종료되지 않습니다.
다른 스크립트에서 비슷한 결과를 얻으려면 다음을 수행할 수 있습니다.
screen -dm -S myscreen
screen -S myscreen -X stuff "export VAR=123; cd /usr/local/myproject^M"
screen -S myscreen -X stuff "./myscript.py && exit^M"
먼저 로그인 쉘이 실행되고 로그인 쉘이 종료될 때까지 닫히지 않는 새 화면이 시작됩니다. 그런 다음 screen
명령을 사용하여 stuff
셸에 텍스트를 입력할 수 있습니다 . 첫 번째 줄에서는 변수를 정의하고 디렉터리를 변경합니다. 두 번째 줄에서는 스크립트를 시작한 다음 셸을 종료합니다(여기서 스크립트가 성공하면 screen 세션을 닫으려고 한다고 가정). 그러나 단락 및 ( &&
) 로 인해 myscript.py
실패할 경우 exit
결코 발생하지 않으며 자유롭게 스크린 세션에 다시 연결하여 무슨 일이 일어났는지 확인할 수 있습니다.
올바르게 입력 하려면 (control-v)를 입력한 다음 Enter 키와 동일하게 입력 ^M
해야 합니다 .^V
^M