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


24

Linux에서 텍스트 편집기와 같은 새 응용 프로그램을 시작했지만 "&"를 사용하지 않았다고 가정 해 봅시다. 해당 응용 프로그램을 닫을 필요없이 백그라운드에서 해당 프로세스를 실행하기 위해 어떤 명령을 사용 하시겠습니까? 이런 방식으로 프로세스를 열고 별도로 작동시킬 수 있습니다 (예 : 프로세스를 생성하는 데 사용한 명령 줄 터미널과 텍스트 편집기와 같은 프로세스가 여전히 실행 중임).


기술적으로는 아니지만 tmux귀하의 질문에 원하는 것과 동일한 기능을 제공합니다.
mkc

1
가능하면 다른 쉘을 여는 간단한 대안을 간과하지 마십시오.
jpmc26

답변:


43

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

예를 들어 수면 명령

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

프로세스가 실행 중이고 여전히 명령 줄이 있습니다.


5
fg작업 ID ( 1이 경우 대괄호로 지정 )를 매개 변수로 사용하는 명령 을 사용하여 프로세스를 포 그라운드로 되돌릴 수 있다는 점을 추가하는 것이 흥미로울 수 있습니다 . 사용에 특정하지 않으며로 bg시작한 프로세스에서 수행 할 수 있습니다 &.
Aaron

14

Ctrl+ Z는 그것을하는 방법이지만 완전성을 위해 : 질문은 "명령"을 요구하며, 그것은 (다른 터미널에서) 것입니다 :

kill -STOP pid_of_the_running_applications

그리고 물론

bg

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


6
킬 -STOP, 그리고 죽여라 -CONT
Michel Billaud

10

배쉬에서 :

Ctrl+ Z다음 bg.

이제 실행 jobs하고 결과를 확인하십시오.


2
@grooveplex Tomas가 먼저 대답 했으므로 Stephen의 답변 아래에 주석을 달면 더 적절할 것입니다.
Anthon

2
우리는 실제로 동시에 대답했습니다. 명백한 대답이기 때문에 우리가 똑같은 것을 말한 것은 놀라운 일이 아닙니다. 예제를 작성하고 형식을 지정하는 데 추가 시간을 소비했기 때문에 Thomas '직후에 답변이 도착했습니다.
Stephen Harris

1
그리고 내 말에 따르면 Bash에 있다고 그들은 동일하지 않습니다.
Tomasz

1
허, 거기에 잠재적 인 포인트가 있습니다. 쉘에 작업 제어가 필요합니다. 내가 작업 한 첫 번째 머신 중 일부 (SVr2 기반)에는 해당 기능 /bin/sh이 없으므로 작동하지 않았을 것입니다
Stephen Harris

1

CTRL- 를 눌러야하는 불편을 방지하기 위해 z편집기를 백그라운드에서 실행하는 래퍼 스크립트를 만들 수 있습니다. 이런 식으로 백그라운드에서 명시 적으로 시작하는 것을 기억할 필요가 없습니다.

    #!/bin/sh

    EDITOR="emacs" # or whatever

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

위에서 우리는 먼저 X 서버를 사용할 수 있는지 확인한 다음 백그라운드에서만 편집기를 실행합니다. . "$@"래퍼 스크립트에 제공 한 것처럼 모든 인수를 선택한 편집자 ( )로 전달합니다 .

명령이 누락되었습니다 ... 기본 실험에 따라 터미널이 포함되지 않은 GUI 프로그램의 경우 먼저 전송 SIGSTOP한 다음 SIGCONT포 그라운드 프로세스 로 간단 합니다 ( kill쉘 스크립트를 사용하여 구현하면 명령 사용) . 물론 다른 터미널 창 / 탭에서 실행해야하며 신호를 보내려는 PID를 편리하고 일반적인 방식으로 찾는 것이 어렵습니다. 기본적으로 주어진 이름의 모든 프로세스에 두 개의 신호를 보낼 수 있습니다 (기본적으로 즐겨 사용하는 편집기로 설정하고 PID를 인수로 사용하도록 허용).

    #!/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관련된 명령 fg및 기타 필요한 조작 을 전송하고 처리 bg합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.