사용자가 로그아웃/로그인하면 백그라운드 프로세스(nohup &)가 일시 중지/재개됩니다.

사용자가 로그아웃/로그인하면 백그라운드 프로세스(nohup &)가 일시 중지/재개됩니다.

우분투 서버 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 ... &터미널 프로세스가 종료된 후에도 실행되도록 설계되었습니다. 나는 그러한 프로세스를 일시 중단하는 핵심 유닉스 메커니즘이 있다고 생각하지 않습니다. 스케줄러는 우선 순위를 변경할 수 있지만(별로 중요하지 않은 프로세스로 간주될 수 있으므로)

나는 프로세스가 계속 실행되고 있다고 확신하지만 파이프와 같은 것이 프로세스를 차단하고 응답하지 못하게 합니다.

관련 정보