"&"가 없는 백그라운드 프로세스

"&"가 없는 백그라운드 프로세스

Linux에서 새 애플리케이션(예: 텍스트 편집기 등)을 시작했는데 "&"를 사용하는 것을 잊어버렸다고 가정해 보세요. 애플리케이션을 닫지 않고도 프로세스가 백그라운드에서 실행되도록 하려면 어떤 명령을 사용하시겠습니까? 이렇게 하면 두 개의 프로세스를 열고 독립적으로 작업할 수 있습니다(예를 들어 프로세스를 생성하는 데 사용된 명령줄 터미널과 텍스트 편집기가 계속 실행 중입니다.)

답변1

터미널 창에서는 일반적으로 Control+를 입력하여 Z프로세스를 "일시 중지"한 다음 bg명령을 사용하여 "백그라운드"합니다.

예를 들어 sleep 명령을 사용하십시오.

$ /bin/sleep 1000
^Z[1] + Stopped                  /bin/sleep 1000
$ bg
[1]     /bin/sleep 1000&
$ jobs
[1] +  Running                 /bin/sleep 1000
$ 

프로세스가 실행 중인 것을 볼 수 있으며 여전히 명령줄이 있습니다.

답변2

Ctrl+ Z는 이를 수행하는 방법이지만 완전성을 위해 다음과 같은 "명령"을 요청하는 질문입니다. 이는 (다른 터미널에서) 다음과 같습니다.

kill -STOP pid_of_the_running_applications

그리고 물론

bg

응용 프로그램 터미널에서.

답변3

큰 타격을 받은 경우:

Ctrl+ Z그러면 bg.

이제 실행 jobs하고 결과를 확인해 보세요.

답변4

CTRL- 를 누르는 불편함을 피하기 위한 예방조치로 z, 편집기가 백그라운드에서 실행할 수 있도록 래퍼 스크립트를 생성할 수 있습니다. 이렇게 하면 백그라운드에서 명시적으로 시작하는 것을 기억할 필요가 없습니다.

    #!/bin/sh

    EDITOR="emacs" # or whatever

    if [ -z "${DISPLAY}" ]; then
      ${EDITOR} "$@"
    else
      ${EDITOR} "$@" &
    fi

위에서 우리는 먼저 편집기를 백그라운드에서 실행하기 전에 사용 가능한 X 서버가 있는지 확인하려고 시도합니다(그렇지 않은 경우 많은 Unix 편집기가 터미널을 사용하므로 이 경우 편집기를 백그라운드 프로세스로 실행하고 싶지 않습니다). . "$@"래퍼 스크립트에 제공한 것처럼 모든 인수를 선택한 편집기( )에 그대로 전달합니다 .

누락된 명령에 관해서는... 내 기본 실험에서 터미널을 포함하지 않는 GUI 프로그램의 경우 포그라운드 프로세스로 보내는 SIGSTOP것만 큼 간단할 수 있습니다( 쉘 스크립트를 사용하여 이 명령을 사용하십시오). 물론 다른 터미널 창/탭에서 실행해야 하지만 일반적인 방법으로 신호를 보내려는 PID를 편리하게 찾는 것이 어렵습니다. 기본적으로 주어진 이름을 가진 모든 프로세스에 두 개의 신호를 보낼 수 있습니다(기본값은 선호하는 편집기이며 PID를 인수로 허용합니다).SIGCONTkill

    #!/bin/sh

    EDITOR=emacs # whatever

    stop_cont_prog()
    {
      case "$1" in
        # begin with number is considered PID - this is not good 
        # enough to be taken seriously...
        [1-9]*) kill -SIGSTOP "$1"; kill -SIGCONT "$2";;
        *)      killall -SIGSTOP "$1"; killall -SIGCONT "$2";;
      esac
    }

    if [ -n "$1" ]; then
      for prog in "$@"; do stop_cont_prog "$1"; done
    else  
      stop_cont_prog "${EDITOR}"
    fi

emacs이 방법은 백그라운드에서 (여러) 명령을 실행한 후 터미널 탭을 올바르게 제공합니다. 그러나 쉘 작업 제어나 터미널 설정의 혼란으로 인해 터미널에서 실행 중인 emacs 프로세스가 제대로 복구되지 못했습니다. 따라서 이 접근 방식은 약간의 복잡성으로 인해 이점을 얻습니다.

이것이 바로 SIGSTOP- (기본값)을 누를 CTRL때 포그라운드 프로세스로 전송되는 것 입니다 z. 기준 stty -a출력

$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]

(출력 약어) 및 stty매뉴얼 페이지:

   susp CHAR
          CHAR will send a terminal stop signal

신호를 사용하여 중지된 프로세스는 신호 SIGSTOP를 보내 다시 시작할 수 있습니다 SIGCONT. 일반적으로 셸 작업 제어 논리는 무시한 명령 과 관련된 기타 필요한 작업을 보내고 SIGCONT처리합니다 .fgbg

관련 정보