[편집하다]
간단하게.
java xxx...
머신 A에서 퍼티 호출을 사용하여 머신 B에서 연결하고 있습니다 . 하지만 B 기계에는 접근할 수 없습니다. java xxx...
머신 B가 종료될 때 종료될 수 없는 실행 중인 프로세스를 설정하기 위해 머신 C에서 머신 A에 어떻게 연결합니까 ?
[원래]
나는 퍼티를 사용하여 서버(머신 A)에 연결하고 있으며 그 서버에서 프로세스가 실행되고 있습니다. 하지만 컴퓨터(컴퓨터 B)를 다시 시작해야 하므로 연결과 퍼티가 끊어질 수 있습니다. 실행 중인 프로세스에 nohup을 설정하지 않았기 때문에 이 프로세스가 종료될 수 있습니다. disown
어떤 이유로 퍼티를 사용하여 설정할 수 없습니다. 그래서 저는 머신 C를 사용하여 서버(머신 A)에 대한 퍼티 연결을 열고, 머신 B가 다시 시작될 때 프로세스가 종료되지 않도록 실행 중인 프로세스를 설정하고 싶습니다.
이를 수행할 수 있는 방법이 있습니까? disown
내가 사용할 수 있는 것과 동일한 쉘 프로세스를 사용하는지 알고 있습니다 . 하지만 더 이상은 그렇지 않습니다.
답변1
프로세스가 SIGHUP 신호를 무시하도록 디버거를 연결할 수 있습니다.
gdb --pid="$pid" --batch -ex 'call signal(1,1)' -ex detach
( $pid
프로세스의 ID는 어디에 있습니까?) 이것을 확장하여 stdout/stdin/stderr을 리디렉션할 수도 있습니다. 그러나 프로세스를 다른 터미널에 다시 연결하는 방법에 대해 여기에 언급된 다른 질문도 확인할 수 있습니다.reptyr
이 사이트 검색).
또 다른 옵션은 Java 프로세스를 제어하는 의사 터미널을 할당하고 구동하는 프로세스를 일시 중지하는 것입니다. 이렇게 하면 ssh 연결이 종료되더라도 죽지 않고, java가 터미널에 너무 많이 쓰지 않는 한 영향을 받지 않습니다.
이는 프로세스 테스트입니다 sleep
.
$ pstree -sp "$(pidof sleep)"
init(1)───sshd(5701)───sshd(62826)───sleep(62842)
$ kill -s STOP 62826
sleep
이제 실행 중인 SSH 클라이언트를 종료합니다 .
$ ps -fC sleep
UID PID PPID C STIME TTY TIME CMD
root 62842 62826 0 09:50 pts/8 00:00:00 sleep 100
sshd
Java 프로세스가 종료되면 완전히 종료될 수 있도록 프로세스를 다시 시작해야 합니다.
답변2
kill 명령에 기회를 주고 특정 신호를 제공하고 싶지만 아직 이 작업을 수행하는 데 적합한 신호를 찾지 못했습니다. 내장된 기능으로는 이 작업을 수행할 수 없다고 말하고 싶습니다. 그러나 누군가가 다음과 같은 코드를 작성했습니다.
답변3
답변4
명령을 실행할 준비가 되었기 때문에 명령을 눌러야 CTRL-Z
정지 상태가 되고 프로그램은 실행되지 않지만 프로그램 상태는 저장되어 언제든지 다시 시작할 수 있습니다.
명령을 실행하여 프로그램에 어떤 작업 ID가 있는지 확인할 수 있습니다 jobs
. 일단 식별하면 그렇게 할 수 있습니다. bg %your_prog_id
프로그램을 백그라운드로 보내면 세션을 닫아도 계속 실행됩니다. 이제 종료하면 프로그램이 계속 실행됩니다.