SSH를 통해 원격 Ubuntu 시스템에 연결한다고 가정해 보겠습니다. nohup
연결이 끊어질 가능성이 있는 경우 스크립트를 실행하고 해당 로그를 파일로 리디렉션하고 싶습니다 . 내가 실행한 명령은
nohup bash myscript.sh > log.txt &
그런 다음 터미널은 스크립트의 PID와 메시지를 인쇄합니다.
nohup은 입력을 무시하고 stderr를 stdout으로 리디렉션합니다.
Ctrl거기에서 커서가 멈추고 D+를 사용하여 SSH 세션을 종료하고 다시 로그인하지 않으면 다른 명령을 실행할 수 없습니다. SSH 세션을 열어두고 다시 로그인할 필요 없이 다음 터미널 프롬프트로 계속 진행하고 싶습니다. 이것을 달성할 수 있는 방법이 있나요?
답변1
예상한 대로 이 명령은 백그라운드에서 실행됩니다. 그러나 이 특별한 경우에는 경쟁 조건이 있으며 출력 메시지는 쉘 프롬프트 뒤에 부분적으로 기록됩니다.
시각적 결과는 쉘 프롬프트가 nohup
메시지 앞에 있거나 메시지가 완전히 덮어쓰여지는 것입니다.
최종 결과는 쉘이 프롬프트를 작성했으므로 다음 명령을 실행할 준비가 되어 있다는 것입니다. Enter를 눌러 새 프롬프트를 생성하거나 다음 명령을 직접 입력할 수 있습니다.
답변2
이것을 .bashrc에 추가하세요
function detach { ( nohup $* </dev/null 2>&1 >/dev/null & disown ; sleep 0 ) >/dev/null ; } ; export -f detach
그런 다음 다음을 실행할 수 있습니다. 예를 들어 detach gedit .bashrc
특정 프로그램에 대한 기능을 만들 수도 있습니다. 예를 들면 다음과 같습니다.
function gedit { ( nohup gedit $* </dev/null 2>&1 >/dev/null & disown ; sleep 0 ) >/dev/null ; } ; export -f gedit
"disown"은 프로그램이 백그라운드에서 종료될 때 출력을 차단합니다.
"sleep 0"을 입력하면 프롬프트가 반환됩니다.