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

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

처음에는 포그라운드에서 실행되는 프로세스가 있습니다. Ctrl+를 눌러 일시 중지 Z한 다음 다시 시작하여 백그라운드에서 실행합니다 bg <jobid>.

백그라운드에서 실행 중인 프로세스를 일시 중지하는 방법을 알고 싶습니다.

백그라운드 프로세스를 포그라운드로 가져오는 방법은 무엇입니까?

편집하다:

fg <jobid>프로세스가 stderr로 출력되는데, 프로세스가 터미널로 출력할 때 어떻게 명령을 실행하나요?

답변1

Tim이 말했듯 fg이 마지막 프로세스를 다시 전경으로 가져오려면 입력하세요.

백그라운드에서 여러 프로세스가 실행 중인 경우 다음을 수행합니다.

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

fg %3vim 23프로세스를 전경으로 되돌립니다 .

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

kill -STOP %job_id

CtrlSIGSTOP 신호는 본질적으로 + 와 동일한 방식으로 프로세스를 중지(일시 중지)합니다 Z.

예: kill -STOP %3.

원천:

답변2

이는 작업 제어 기능이 있는 모든 쉘에 해당되며, 매우 오래된 쉘을 다루지 않는 한 (대부분) 이를 당연하게 여길 수 있습니다. 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+ 를 사용하고 싶습니다. 확실히 기본적으로 죽이고 싶지 않습니다! (이 논리는 내가 더 이상 이 키 바인딩을 사용하지 않는 이유에도 적용됩니다. +를 눌러 프로세스를 중지하면 마지막으로 하고 싶은 일은 다시 시작하는 것입니다!)ckill %1bgCtrlz

비대화형

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

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

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

답장: 표준 오류

이 질문의 편집자는 표준 오류에 대해 질문했습니다.

fg <jobid>프로세스가 stderr로 출력되는데, 프로세스가 터미널로 출력할 때 어떻게 명령을 실행하나요?

문제의 작업에 백그라운드 구성 요소가 없는 한(또는 전체 작업이 백그라운드를 통과할 수 있는 경우 kill -CONT) 일시 중지된 동안 실제로 출력이 표시되어서는 안 됩니다.

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

작업 설명자를 정말로 찾아야 한다면 다른 터미널을 사용하여 STOP위에서 설명한 비대화형 방법을 통해 신호를 보내십시오. 그러면 작업 설명자를 찾기 위해 실행한 다음 해당 숫자가 있는 곳에서 실행할 수 있도록 디스플레이가 확보되어야 합니다( Enter몇 번의 클릭 또는 실행 clear또는 Ctrl+ L) .jobsfg %NN

답변3

입력 fg하여 전경으로 가져옵니다.

답변4

프로세스를 종료하는 방법에는 여러 가지가 있습니다. 일반적으로 콘솔 기반 명령에서 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. 프로세스가 일반 명령을 무시하는 경우 다음과 같이 프로세스 ID 뒤에 kill명령을 사용할 수 있습니다 .kill -9

$kill -9 6738
Terminated

관련 정보