백그라운드 프로세스를 일시 중단하고 포 그라운드로 가져 오는 방법


166

원래 포 그라운드에서 실행중인 프로세스가 있습니다. 나는 Ctrl+로 일시 중단 한 Z다음에 의해 백그라운드에서 실행을 다시 시작합니다 bg <jobid>.

백그라운드에서 실행중인 프로세스를 일시 중단하는 방법이 궁금합니다.

백그라운드 프로세스를 포 그라운드로 가져 오려면 어떻게해야합니까?

편집하다:

프로세스는 stderr로 출력되므로 fg <jobid>프로세스가 터미널에 출력되는 동안 어떻게 명령 을 발행해야 합니까?


1
오류가 발생하는 터미널에 여전히 명령을 입력 할 수 있습니다. STDERR에 뿌린 텍스트는 입력으로 간주되지 않으며 사용자가 보낸 키만 계산합니다. 화면에 혼란스러워 보이지만 작동합니다.
Caleb

@ Caleb : 프로세스가 stdout으로 출력하더라도 fg <jobid>전경을 만들기 위해 입력 할 수 있습니까?
Tim

@Tim : 그렇습니다.
Caleb

답변:


214

Tim이 말했듯이 입력 fg하여 마지막 프로세스를 다시 포 그라운드로 만듭니다.

백그라운드에서 둘 이상의 프로세스가 실행중인 경우 다음을 수행하십시오.

$ jobs
[1]   Stopped                 vim
[2]-  Stopped                 bash
[3]+  Stopped                 vim 23

fg %3vim 23프로세스를 다시 포 그라운드 로 가져옵니다 .

백그라운드에서 실행중인 프로세스를 일시 중단하려면 다음을 사용하십시오.

kill -STOP %job_id

SIGSTOP 신호는 Ctrl+ 와 같은 방식으로 프로세스를 중지 (일시 정지)합니다 Z.

예 : kill -STOP %3.

출처 : Linux 및 Unix에서 프로세스에 신호를 보내는 방법백그라운드 및 포 그라운드 작업을 관리하는 방법 .


23
신호 19는 SIGCONT나를위한 것입니다. 내가 사용 kill -STOP하고 kill -CONT어쨌든 번호를 기억에 우선하여,하지만 당신은 확인할 수 있습니다 kill -l숫자 값으로 자신을 생각 나게하는
쓸모없는

프로세스는 stderr로 출력되므로 명령을 어떻게 실행 job하고 fg <jobid>프로세스가 터미널에 출력되는 동안 어떻게해야 합니까?
Tim

1
@Tim 평소처럼 명령을 입력하십시오. 작업이 백그라운드에있는 한, 입력 한 내용을 읽지 못합니다-쉘입니다. 입력 한 내용이 나에게 보이지만 셸에서 잘 이해합니다.
AlexWebr

@AlexWebr : 고맙습니다, 작동합니다! (1) 백그라운드 작업이 "Ctrl + Z"등을 포함한 입력 및 출력을 허용하지 않습니까? (2) 백그라운드에서 실행중인 작업을 직접 중단 할 수 있습니까? 그렇다면 어떻게? 그렇지 않은 경우 일시 중단되기 전에 포 그라운드에서 실행되도록 먼저 변경해야합니까?
Tim

2
백그라운드에서 실행중인 작업을 직접 중단 될 수 예 : kill -STOP %job_id설명으로
쓸모없는

31

이것은 작업 제어 기능이있는 모든 쉘에 해당되며, 대부분의 경우 진정한 고대 쉘을 다루지 않는 한 당연한 것으로 간주 될 수 있습니다. POSIX 표준 에 있으므로 dash작업 제어 도 지원합니다 (대화식 또는로 실행할 때 -m).

인터렉티브

  • Ctrl+ z현재 포 그라운드 된 프로그램을 일시 중단합니다
  • bg가장 최근에 정지 된 프로그램의 배경이됩니다
    ( bg %2작업 번호와 함께 사용 하여 확인할 수 있음 jobs)
  • fg 가장 최근에 중단 된 프로그램을 포 그라운드

에서 다른 + 를 통해 프롬프트에서 zsh암시 적으로 실행하는 키 바인딩을 작성할 수 있습니다 .fgCtrlz

_zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg

bg일시 중단시 암시 적으로 실행되는 영리한 방법이있을 수도 있지만 현명하지 않은 것 같습니다. 적어도 나를 위해, 나의 Ctrl+ z사용법 의 대부분은 Ctrl+ c가 깨지지 않기 때문 입니다. 나는 그 kill %1대신 예를 들어서 그것을 따르고 싶지만 bg분명히 살인을 기본값으로하고 싶지 않습니다! (이 논리는 내가 더 이상 구속력이 키를 사용하지 않는 이유에 확장 : 나는에 망치있어 경우 Ctrl+ z! 프로세스를 중지, 내가이 원하는 마지막 것은 다시 시작입니다)

비 대화식

다른 셸 인스턴스 (또는 때로는 sudo명령을 포함한 다른 사용자 )에 있다면 작업 번호를 사용하지 못할 수 있습니다.

프로세스 ID (PID)를 알고 나면 다른 프로세스에서 계속 작업 할 수 있습니다. pgrep …, 또는 ps aux |grep …(또는 동일한 셸 jobs -l, 또는 $!) 에서 PID를 얻을 수 있으며 다음을 실행할 수 있습니다.

kill -STOP $PID  # suspend
kill -CONT $PID  # continue (resume)

프로세스 ID를 모르고 프로세스의 다른 인스턴스를 이름으로 일시 중단 할 염려가없는 경우 다음 중 하나에 신호를 전달할 수 있습니다.

killall -STOP program_name
pkill -STOP program_name
pkill -f -STOP program_name_or_args

+ ( 'd가 아님)로 CONT중지 된 프로그램에 대한 신호 는 마치 마치 마치 전경과 같이 진행을 다시 시작합니다 (포 그라운드에서) .Ctrlzbgfg

다시 : 표준 오류

이 질문에 대한 편집은 표준 오류에 대해 묻습니다.

프로세스는 stderr로 출력되므로 fg <jobid>프로세스가 터미널에 출력되는 동안 어떻게 명령 을 발행해야 합니까?

해당 작업에 백그라운드로 구성 요소가 있거나 (또는 ​​전체 작업이 아마를 통해 백그라운드로 kill -CONT) 구성되지 않는 한, 일시 중단 된 동안 실제로 출력을 볼 수 없습니다.

여전히 데이터를 출력하는 경우 (표준 출력 또는 표준 오류로) 터미널이 시각적으로 복잡해 지지만 입력의 일부가 아니기 때문에 모든 출력이 무시됩니다. 이렇게하면 오타를 입력하지 않은 것을 알기가 더 어려워 질 수 있지만 (맹목적으로) 타이핑 fgEnter하면 충분합니다 (여러 개의 작업이 있고 해당 작업이 최신이 아닌 경우에는 작업 설명자가 필요합니다) ).

작업 설명자를 찾아야하는 경우 다른 터미널을 사용 STOP하여 위의 비 대화식 방법을 통해 신호를 보내십시오 . 이렇게하면 디스플레이가 비워져 (아마도 Enter몇 번 누르 거나 실행 clear또는 Ctrl+ L) jobs작업 설명자를 찾기 위해 실행 한 다음 해당 번호가 fg %N있는 곳에서 실행할 N수 있습니다.


프로세스 일시 정지 및 재개와 관련된 유일한 문제점은 다른 프로그램 (예 : RabbitMQ)에 연결 한 경우 다시 시작할 때 연결이 끊어진다는 것입니다.
Nav

@Nav – 헤드리스를 실행하지 않았기 때문입니다. 배쉬와 zsh을, 나는 당신이 단지해야 할 생각 부인 백그라운드로 프로세스를. nohup 또는 screen 또는 tmux 와 같은 터미널 멀티플렉서를 사용 하여 이러한 작업을 실행하는 것을 선호합니다 . 별도의 연결에서 백그라운드 프로세스를 재개 할 수없는 것처럼 nohup 프로세스를 선택할 수는 없지만 멀티플렉서에 연결할 수 있습니다.
Adam Katz

백그라운드 프로세스였습니다. 터미널을 닫은 후 다른 터미널에서 서버에 로그인했습니다.
Nav

예, 다른 쉘에서 프로세스를 시작하지 않으면 프로세스를 다시 시작할 수 없습니다. 나는 그것을 위해 screen 또는 tmux를 권장합니다.
Adam Katz

CONTCtrl + Z로 중지 된 프로세스 (작업 / 파이프 라인)에 신호를 보내면 아직 보내지 않아도 백그라운드에서 다시 시작됩니다 bg.
G-Man

10

fg포 그라운드로 가져 오려면 입력 하십시오.


감사! 프로세스는 stderr로 출력되므로 fg <jobid>프로세스가 터미널에 출력되는 동안 어떻게 명령 을 발행해야 합니까?
Tim

1
  1. jobs명령으로 작업 나열
  2. fg; 를 사용하여 대상 작업을 포 그라운드로 가져옵니다 . 예 : fg %4
  3. 히트 CTRL Z중단
  4. 백그라운드에서 실행하려면 bg; 예 :bg %4

0

프로세스 종료는 여러 가지 방법으로 수행 할 수 있습니다. 종종 콘솔 기반 명령에서 Ctrlc키 입력 (기본 인터럽트 문자)을 보내면 명령 이 종료됩니다. 프로세스가 포 그라운드 모드에서 실행될 때 작동합니다.

프로세스가 백그라운드 모드에서 실행중인 경우 먼저 ps명령을 사용하여 작업 ID를 가져와야하며 그 후에 kill 명령을 사용하여 다음과 같이 프로세스를 종료 할 수 있습니다.

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated

여기서 kill명령은 first_one프로세스를 종료합니다 . 프로세스가 일반 kill명령을 무시하면 kill -9다음과 같이 프로세스 ID를 사용할 수 있습니다 .

$kill -9 6738
Terminated

1
이것은 사실이지만, 질문에 대답하지 않습니다 ...
jasonwryan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.