Linux에서 SSH 클라이언트를 닫은 후 백그라운드 프로세스가 중지되는 것을 방지하는 방법

StackOverflow https://stackoverflow.com/questions/285015

문제

저는 SSH(Putty)를 통해 Linux 시스템에서 작업하고 있습니다.밤에 프로세스를 실행 상태로 두어야 하므로 백그라운드에서 프로세스를 시작하고(명령 끝에 앰퍼샌드 사용) stdout을 파일로 리디렉션하면 그렇게 할 수 있다고 생각했습니다.놀랍게도 그것은 작동하지 않습니다.Putty 창을 닫자마자 프로세스가 중지됩니다.

그런 일이 발생하지 않도록 어떻게 할 수 있나요??

도움이 되었습니까?

해결책

"Nohup"프로그램.

다른 팁

나는 사용하는 것이 좋습니다 GNU 화면.이를 통해 모든 프로세스가 계속 실행되는 동안 서버와의 연결을 끊을 수 있습니다.그것이 존재한다는 것을 알기 전에는 그것이 없이 어떻게 살았는지 모르겠습니다.

세션이 닫히면 프로세스는 분명히 잡을 수없는 샴페인 신호를 수신합니다. 당신은 사용할 수 있습니다 nohup 프로세스 또는 Bash 내장 명령을 시작할 때 명령 disown -h 이런 일이 발생하지 않도록 프로세스를 시작한 후 :

> help disown
disown: disown [-h] [-ar] [jobspec ...]
     By default, removes each JOBSPEC argument from the table of active jobs.
    If the -h option is given, the job is not removed from the table, but is
    marked so that SIGHUP is not sent to the job if the shell receives a
    SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all
    jobs from the job table; the -r option means to remove only running jobs.

데몬? nohup? 화면? (tmux ftw, 화면은 정크입니다 ;-)

처음부터 다른 모든 앱이 수행 한 작업을 수행하십시오. Double Fork.

# ((exec sleep 30)&)
# grep PPid /proc/`pgrep sleep`/status
PPid:   1
# jobs
# disown
bash: disown: current: no such job

쾅! 완료 :-) 나는 모든 유형의 앱과 많은 오래된 기계 에서이 수많은 시간을 사용했습니다. 리디렉션과 결합하여 귀하와 프로세스 사이에 개인 채널을 열 수 있습니다.

coproc.sh로 만들기 :

#!/bin/bash

IFS=

run_in_coproc () {
    echo "coproc[$1] -> main"
    read -r; echo $REPLY
}

# dynamic-coprocess-generator. nice.
_coproc () {
    local i o e n=${1//[^A-Za-z0-9_]}; shift
    exec {i}<> <(:) {o}<> >(:) {e}<> >(:)
. /dev/stdin <<COPROC "${@}"
    (("\$@")&) <&$i >&$o 2>&$e
    $n=( $o $i $e )
COPROC
}

# pi-rads-of-awesome?
for x in {0..5}; do
    _coproc COPROC$x run_in_coproc $x
    declare -p COPROC$x
done

for x in COPROC{0..5}; do
. /dev/stdin <<RUN
    read -r -u \${$x[0]}; echo \$REPLY
    echo "$x <- main" >&\${$x[1]}
    read -r -u \${$x[0]}; echo \$REPLY
RUN
done

그리고

# ./coproc.sh 
declare -a COPROC0='([0]="21" [1]="16" [2]="23")'
declare -a COPROC1='([0]="24" [1]="19" [2]="26")'
declare -a COPROC2='([0]="27" [1]="22" [2]="29")'
declare -a COPROC3='([0]="30" [1]="25" [2]="32")'
declare -a COPROC4='([0]="33" [1]="28" [2]="35")'
declare -a COPROC5='([0]="36" [1]="31" [2]="38")'
coproc[0] -> main
COPROC0 <- main
coproc[1] -> main
COPROC1 <- main
coproc[2] -> main
COPROC2 <- main
coproc[3] -> main
COPROC3 <- main
coproc[4] -> main
COPROC4 <- main
coproc[5] -> main
COPROC5 <- main

그리고 당신은 가고, 무엇이든 스폰됩니다. <(:)는 프로세스 대체를 통해 익명 파이프를 엽니 다. 나는 보통 a sleep 1 대신에 : 약간의 급격하고 "파일 바쁜"오류를 얻을 수 있기 때문에 실제 명령이 실행되면 결코 일어나지 않습니다 (예 : command true)

"Heredoc 소싱":

. /dev/stdin <<EOF
[...]
EOF

이것은 내가 시도한 모든 단일 쉘에서 BusyBox/etc (initramfs)를 포함하여 작동합니다. 나는 전에 그것을 본 적이 없다. 나는 소스가 Args를 받아 들일 수 있다는 것을 누가 알았는가? 그러나 그러한 것이 있다면 종종 훨씬 더 관리하기 쉬운 형태의 평가 역할을합니다.

nohup blah &

Blah의 프로세스 이름을 대체하십시오!

개인적으로, 나는 '배치'명령을 좋아합니다.

$ batch
> mycommand -x arg1 -y arg2 -z arg3
> ^D

이것은 배경에 넣은 다음 결과를 당신에게 우편으로 보냅니다. Cron의 일부입니다.

다른 사람들이 언급했듯이 SSH 세션에서 연결을 끊을 수 있도록 백그라운드에서 프로세스를 실행하려면 SSH 세션이 사용하는 의사 tty인 제어 터미널에서 백그라운드 프로세스를 적절하게 분리해야 합니다.

Stevens의 "Advanced Network Program, Vol 1, 3rd Edn" 또는 Rochkind의 "Advanced Unix 프로그래밍"과 같은 책에서 데몬화 프로세스에 대한 정보를 찾을 수 있습니다.

나는 최근(지난 몇 년 동안) 스스로를 제대로 악마화하지 못하는 난폭한 프로그램을 처리해야 했습니다.나는 nohup과 비슷하지만 더 많은 제어 기능을 사용할 수 있는 일반적인 데몬화 프로그램을 만들어 이 문제를 해결했습니다.

Usage: daemonize [-abchptxV][-d dir][-e err][-i in][-o out][-s sigs][-k fds][-m umask] -- command [args...]
  -V          print version and exit
  -a          output files in append mode (O_APPEND)
  -b          both output and error go to output file
  -c          create output files (O_CREAT)
  -d dir      change to given directory
  -e file     error file (standard error - /dev/null)
  -h          print help and exit
  -i file     input file (standard input - /dev/null)
  -k fd-list  keep file descriptors listed open
  -m umask    set umask (octal)
  -o file     output file (standard output - /dev/null)
  -s sig-list ignore signal numbers
  -t          truncate output files (O_TRUNC)
  -p          print daemon PID on original stdout
  -x          output files must be new (O_EXCL)

GNU getopt() 함수를 사용하지 않는 시스템에서는 이중 대시가 선택 사항입니다.Linux 등에서는 필요합니다(또는 환경에서 POSIXLY_CORRECT를 지정해야 함).이중 대시는 어디에서나 작동하므로 이를 사용하는 것이 가장 좋습니다.

소스를 원하시면 저에게 연락하실 수 있습니다(gmail dot com의 이름과 성). daemonize.

그러나 코드는 이제 (마지막으로) 내 GitHub의 GitHub에서 사용할 수 있습니다. SOQ (오버 플로우 질문 스택) 리포지토리는 파일로 daemonize-1.10.tgz 에서패키지하위 디렉토리.

화면을 사용하여 프로세스를 루트로 실행하는 경우 권한 상승 공격의 가능성을 조심하십시오. 자신의 계정이 어떻게 든 타협되면 전체 서버를 인수 할 수있는 직접적인 방법이 있습니다.

이 프로세스가 정기적으로 실행되어야하고 서버에서 충분한 액세스 권한이있는 경우 더 나은 옵션은 작업 실행을 사용하는 것입니다. 또한 init.d (슈퍼 데몬)를 사용하여 백그라운드에서 프로세스를 시작할 수 있으며 완료 되 자마자 종료 될 수 있습니다.

데비안 기반 시스템 (원격 기계에서)에서 설치 :

sudo apt-get 설치 tmux

용법:

tmux

원하는 명령을 실행하십시오

세션 이름 바꾸려면 :

Ctrl+b 그 다음에 $

이름을 설정합니다

세션 종료 :

Ctrl+b 그 다음에

(이것은 tmux 세션을 남깁니다). 그런 다음 SSH에서 로그 아웃 할 수 있습니다.

다시 돌아 오거나 다시 확인 해야하는 경우 SSH를 시작하고

tmux 첨부 세션_name

TMUX 세션으로 돌아갑니다.

nohup 세부 정보를 파일에 로그인하려면 매우 좋습니다. 그러나 배경으로 갈 때 스크립트가 요청하면 암호를 줄 수 없습니다. 나는 당신이 시도해야한다고 생각합니다 screen. 예를 들어 Centos에서 Yum을 사용하여 Linux 배포에 설치할 수있는 유틸리티입니다. yum install screen 그런 다음 쉘 유형의 퍼티 또는 다른 소프트웨어를 통해 서버에 액세스하십시오. screen. 퍼티에서 화면 [0]이 열립니다. 당신의 일을하십시오. 동일한 퍼티 세션에서 더 많은 화면 [1], 화면 [2] 등을 만들 수 있습니다.

알아야 할 기본 명령 :

화면을 시작하려면

화면


에게 다음 화면을 다시 시작하십시오

ctrl+a+c


이동합니다 N당신이 만든 내선 화면

ctrl+a+n


에게 에타 타

ctrl+a+d


작업 중에 퍼티를 닫습니다. 다음에 퍼티 유형을 통해 로그인 할 때

화면 -r

화면에 다시 연결하려면 프로세스가 여전히 화면에서 실행되는 것을 볼 수 있습니다. 화면 유형을 종료하려면 #Exit.

자세한 내용은 참조하십시오 man screen.

대부분의 프로세스의 경우이 오래된 Linux 명령 라인 트릭을 사용하여 의사를 부정 할 수 있습니다.

# ((mycommand &)&)

예를 들어:

# ((sleep 30 &)&)
# exit

그런 다음 새 터미널 창을 시작하고 :

# ps aux | grep sleep

그것을 보여줄 것입니다 sleep 30 여전히 실행 중입니다.

당신이 한 일은 자녀의 자녀로서 과정을 시작하고, 나가면 nohup 일반적으로 종료하는 프로세스를 트리거하는 명령은 그랜드 자녀에게 계단식으로 내려 가지 않아 고아 프로세스로 남겨두고 여전히 실행됩니다.

나는이 "설정하고 그것을 잊어 버린다"라는 접근 방식을 선호합니다. nohup, screen, tmux, I/O 리디렉션 또는 그 물건.

NOHUP을 사용하면 부모 프로세스가 죽으면 클라이언트 프로세스를 죽일 수 없습니다. 더 나은 사용 :

nohup /bin/sh -c "echo \$\$ > $pidfile; exec $FOO_BIN $FOO_CONFIG  " > /dev/null

Nohup은 SSH 세션과 하위 프로세스가 로그 아웃 될 때 종료에 대한 면역을 시작합니다. 내가 준 명령은 응용 프로그램의 PID를 PID 파일에 저장할 수있는 방법을 제공하여 나중에 제거하고 로그 아웃 한 후 프로세스를 실행할 수 있도록합니다.

화면 사용. 사용하기가 매우 간단하며 터미널의 VNC와 같이 작동합니다.http://www.bangmoney.org/presentations/screen.html

X 애플리케이션을 기꺼이 실행하려는 경우 사용하십시오. XPRA "화면"과 함께.

나는 또한 스크린 프로그램을 위해 갈 것입니다 (일부 다른 답변은 스크린이지만 이것은 완료입니다)

&, ctrl+z bg disown, nohup 등의 사실뿐만 아니라 로그 오프 작업이 여전히 죽을 것이라는 불쾌한 놀라움을 줄 수 있습니다. 원인으로 화면을 사용하도록 전환했지만 이중 포킹이 그것을 해결할 수 있으므로 Anthonyringer 솔루션이 있다고 생각합니다.) 주요한 백 그라운드에 비해 이점 :

screen will background your process without losing interactive control to it

그리고 BTW, 이것은 처음에는 결코 묻지 않을 질문입니다. :) ... 나는 어떤 unix에서 무엇이든 작업하는 시작부터 화면을 사용합니다 ... 나는 (거의) 화면을 시작하지 않고 UNIX/Linux 쉘에서 작동하지 않습니다. 첫째 ... 그리고 나는 지금 멈추어야합니다. 그렇지 않으면 좋은 화면이 무엇인지, 그리고 나중에 할 수있는 일에 대한 끝없는 프레젠테이션을 시작할 것입니다 ... 혼자서 찾아보십시오.)

또한 있습니다 악마 오픈 소스리스 슬랙 패키지의 명령.

daemon 매우 구성 가능하며 자동 재시작, 로깅 또는 PidFile 처리와 같은 모든 지루한 데몬 제품에 관심이 있습니다.

이 문자열을 당신의 명령에 추가하십시오 :> & -2> &- <&- &. > &- 닫기 stdout을 의미합니다. 2> &-는 닫기 stderr를 의미합니다. <&-는 닫기 stdin을 의미합니다. & 백그라운드에서 실행되는 것을 의미합니다. 이것은 프로그램적으로 SSH를 통해 작업을 시작하는 데 효과가 있습니다.

$ ssh myhost 'sleep 30 >&- 2>&- <&- &'
# ssh returns right away, and your sleep job is running remotely
$

화면 명령을 사용했습니다. 이 링크에는이 작업을 수행하는 방법에 대한 세부 사항이 있습니다.

https://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/#starting

받아 들여진 대답은 사용을 제안합니다 Nohup. 차라리 사용하는 것이 좋습니다 PM2. 사용 PM2 ~ 위에 Nohup 애플리케이션을 유지하고 응용 프로그램을 위해 로그 파일을 유지하는 것과 같은 많은 장점이 있습니다. 자세한 내용은 이것 좀 봐.

설치하기 위해서 PM2 다운로드해야합니다 NPM. 데비안 기반 시스템의 경우

sudo apt-get install npm

그리고 redhat의 경우

sudo yum install npm

또는 따라갈 수 있습니다 이 지시. 설치 후 NPM 설치하는 데 사용하십시오 PM2

npm install pm2@latest -g

완료되면 응용 프로그램을 시작할 수 있습니다

$ pm2 start app.js              # Start, Daemonize and auto-restart application (Node)
$ pm2 start app.py              # Start, Daemonize and auto-restart application (Python)

프로세스 모니터링 사용 : 다음 명령 :

$ pm2 list                      # List all processes started with PM2
$ pm2 monit                     # Display memory and cpu usage of each app
$ pm2 show [app-name]           # Show all informations about application

앱 이름 또는 프로세스 ID를 사용하여 프로세스를 관리하거나 모든 프로세스를 함께 관리합니다.

$ pm2 stop     <app_name|id|'all'|json_conf>
$ pm2 restart  <app_name|id|'all'|json_conf>
$ pm2 delete   <app_name|id|'all'|json_conf>

로그 파일을 찾을 수 있습니다

$HOME/.pm2/logs #contain all applications logs

이진 실행 파일은 PM2를 사용하여 실행할 수도 있습니다. Jason 파일을 변경해야합니다. 변경 "exec_interpreter" : "node", 에게 "exec_interpreter" : "none". (참조 속성 섹션).

#include <stdio.h>
#include <unistd.h>  //No standard C library
int main(void)
{
    printf("Hello World\n");
    sleep (100);
    printf("Hello World\n");

    return 0;
}

위의 코드 컴파일

gcc -o hello hello.c  

백그라운드에서 NP2로 실행하십시오

pm2 start ./hello

SystemD/Linux에서 Systemd-Run 세션 독립적 프로세스를 시작하는 좋은 도구입니다. 싫어하는 사람들은 미워할거야

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top