프로세스 Java가 여전히 종료되고 있습니다.


11

대학 서버에서 Java 프로그램을 실행해야합니다. ssh를 통해 서버를 통해 원격으로 로그인하고 있습니다.

그래서 nohup을 다음과 같이 사용했습니다.

nohup java -jar project.jar &

그러나 로그 아웃하고 터미널을 닫은 다음 서버에 다시 로그인하면 프로세스가 누락되거나 종료됩니다.


리디렉션 stdoutstderr일부 파일로 시도 -닫힌 터미널 stdout/에 쓰려고 할 때 SIGHUP 이외의 신호로 인해 프로세스가 종료 될 수 있습니다 stderr. 예를 들어 작업 표시 >/dev/null 2>&1전에 명령에 추가 &하십시오.
Boris Burkov

1
@Bob은 필요하지 않습니다. nohup대부분의 구현에서는 기본적으로이를 수행합니다 . stdin예를 들어 리디렉션해야 할 수도 있습니다 </dev/null.
Graeme

답변:


14

nohup프로그램을 면역 SIGHUP하고 SIGQUIT신호 로만 만듭니다 . 현대 쉘은 세션에서 로그 아웃 할 때 다른 신호를 보낼 수 있으므로 아래에서 실행하더라도 프로그램이 종료되지 않을 것이라는 보장은 없습니다 nohup.

더 나은 솔루션은 tmux또는 screen을 사용 bash하거나을 사용 하면 다음을 시도 할 수 있습니다.

$ java -jar project.jar &
$ disown

를 사용 disown하는 경우 수동으로 리디렉션해야합니다. 예 : add</dev/null &>/dev/null
Graeme

@Graeme : 더 이상 쉘로 작업하지 않으면 (명령을 실행하고 종료하십시오) 리디렉션 할 필요가 없습니다.
cuonglm

시도하십시오 ssh localhost 'sleep 10m & disown'. bash종료되지 않습니다.
Graeme

ssh터미널에 연결된 프로그램이 있으면 종료되지 않는 것 같습니다 . 그러나 대화식으로 실행하면 위의 내용이 적합합니다.
Graeme

Linux (GNU coreutils 및 busybox) 및 BSD 구현은 nohup명령에 면역성을 부여하지 않고 SIGQUIT단지 명령 에만 영향을 SIGHUP줍니다. 그것은 명시 적으로 표준 에 위배 되며 AFAIK는 (일부 버전의) Solaris에서만 발생할 수 있습니다.
mosvy

13

(만성 역기능) 대신에 또 다른 옵션 nohup:

setsid java -jar project.jar </dev/zero &>/dev/null &

이것은 프로세스를 효과적으로 "시연한다". 이제는 init 소유이므로 HUP를 얻지 못하고 I / O 스트림이 안전하며 백그라운드로 분기되었습니다.

자세한 내용 man setsid은 참조하십시오. 달리 screen거나 tmux,이 소유권을 주장하고 계속 실행하는 프로그램이 아닙니다. 단순히 자체 프로세스 그룹 에서 프로그램을 시작합니다 .


왜 nohup이 기능하지 않습니까?
cpugeniusmv

@cpugeniusmv 나는 그것이 무언가에 좋다고 확신하지만, 종종 권장되는 목적, 어딘가에 로그인, 프로세스 시작 및 로그 아웃 (OP와 매우 유사)을 위해 신뢰할만한 것을 찾지 못했습니다. 나는 그것이 잘못 사용되었을 수 있다고 생각하며 아마도이 setsid방법으로 조금 더 바보 증거 일 것입니다. nohup에 의해 암시 된 단계를 건너 뜁니다 (init에 의해 고아로 프로세스가 재 부모되도록 함). nohup나중에 작업을 포 그라운드하려는 경우 더 유연합니다.
goldilocks

@ TAFKA'goldilocks '문제는 stdin, stdout 및 stderr를 처리하는 데 문제가 있다고 생각합니다. Nohup은 SIGHUP으로부터 프로세스를 보호하면서 주요 작업을 잘 수행합니다. 그러나 버퍼 크기에 따라 스트림에 잘못 될 수있는 많은 것들이 있습니다. 나는 nohup이 틀린 것이 아니라 nohup이하는 일에 대한 기대라고 말하고 싶습니다.
Volker Siegel


-2

STDOUT 및 STDERR을 null로 리디렉션하여 nohup을 실행하십시오.

nohup java -jar project.jar 2>&1 &

1
당신은 stderr을 stdout으로 만 리디렉션하고 있습니다. nohup이 작동하는 방식에 대해서는 아무것도 변경하지 않습니다 (둘 다로 리디렉션 nohup.out).
Gilles 'SO- 악마 그만'

1
-1, 나는 당신이 의미한다고 생각 nohup java -jar project.jar 2>/dev/null &하지만 당신은 분명히 당신이 무엇을하고 있는지 모른다. 더 나은 피드도 stdin /dev/null.
PlasmaPower

@PlasmaPower 여기에 +1이 있습니다. 좋은 하루 되세요 :)
boris quiroz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.