우분투 서버 11.10
일반(루트가 아닌) 사용자가 nohup(nohup java ... &)로 프로세스를 시작하면 사용자가 터미널(ssh) 연결을 끊으면 프로세스가 응답을 중지합니다. 사용자가 다시 연결하면 프로세스가 다시 응답하기 시작합니다. 예를 들어 프로세스는 프로세스를 시작한 사용자가 터미널에서 연결을 끊을 때 쿼리 응답을 중지하고 사용자가 다시 로그인하면 다시 응답을 시작하는 데이터베이스(H2)입니다.
프로세스가 백그라운드에서 실행되는 것을 방해하는, 내가 모르는 백그라운드 프로세스 권한이 있습니까? 이 동작의 원인은 무엇입니까?
답변1
nohup
당신에게 도움이 될 것입니다. 정확한 명령은 무엇입니까? 아마도 뭔가를 놓치고 있을 수도 있습니다. 이에 대한 Wikipedia의 섹션은 다음과 같습니다.
Nohupping backgrounded jobs is typically used to avoid terminating them when logging
off from a remote SSH session. A different issue that often arises in this situation
is that ssh is refusing to log off ("hangs"), since it refuses to lose any data
from/to the background job(s). This problem can also be overcome by redirecting all
three I/O streams:
nohup ./myprogram > foo.out 2> foo.err < /dev/null &
따라서 다음과 같이 할 수 있습니다.
ssh -n -f user@remotebox "sh -c 'cd /foo/bar; nohup ./myprogram > foo.out 2> foo.err < /dev/null &'"
또는 그래도 문제가 해결되지 않으면 시도해 볼 수 있습니다 screen
. 이를 통해 "백그라운드"에서 프로세스를 실행할 수 있으며 로그아웃한 후에도 계속 실행됩니다.
먼저 ssh
원격 상자로 이동한 다음 거기에서 screen
프로세스를 사용하고 시작하고 screen
원하는 경우 세션 이름을 지정할 수 있습니다. 실제로는 다른 점을 눈치채지 못하겠지만 해당 세션에서 프로세스를 시작하세요. screen
명령을 사용하여 세션을 종료할 수 있습니다 Ctrl-a d
. 다음과 같이 보일 것입니다:
user@remotebox:~$ screen -S foobarsession
user@remotebox:~$ startmyprocess
[detached from 4865.foobarsession]
user@remotebox:~$
그런 다음 SSH 세션을 종료하면 프로세스가 계속 실행됩니다. screen
나중에 세션 에 다시 연결하려면 SSH를 통해 원격 상자로 돌아가서 screen -r
다시 연결하세요. screen -ls
세션을 나열하는 데 사용할 수 있습니다 .
user@remotebox:~$ screen -ls
There is a screen on:
4865.foobarsession (10/05/2012 11:10:57 AM) (Detached)
1 Socket in /var/run/screen/S-user
user@remotebox:~$ screen -r foobarsession
user@remotebox:~$ screen -ls
4865.foobarsession (10/05/2012 11:10:57 AM) (Attached)
1 Socket in /var/run/screen/S-user
user@remotebox:~$
답변2
시작된 프로세스는 nohup ... &
터미널 프로세스가 종료된 후에도 실행되도록 설계되었습니다. 나는 그러한 프로세스를 일시 중단하는 핵심 유닉스 메커니즘이 있다고 생각하지 않습니다. 스케줄러는 우선 순위를 변경할 수 있지만(별로 중요하지 않은 프로세스로 간주될 수 있으므로)
나는 프로세스가 계속 실행되고 있다고 확신하지만 파이프와 같은 것이 프로세스를 차단하고 응답하지 못하게 합니다.