백그라운드에서 두 프로세스를 시작하고 두 번째 작업을 포그라운드로 가져오려면 어떻게 해야 합니까?

백그라운드에서 두 프로세스를 시작하고 두 번째 작업을 포그라운드로 가져오려면 어떻게 해야 합니까?

이 두 가지 프로세스는 다음과 같습니다.

cat /dev/tty > /dev/null &
cat /dev/zero > /dev/null &

백그라운드에서 실행해야 하는데 두 번째 작업을 포그라운드로 가져올 수 없습니다.

답변1

이것이 두 개의 일반 작업인 경우 aa plain은 fg두 번째 작업을 포그라운드로 가져옵니다(이 작업이 최근에 일시 중지된 백그라운드 작업이거나 최근에 시작된 백그라운드 작업인 경우(다른 작업은 일시 중지되지 않음)).

그러나 첫 번째 작업(읽기)의 특성으로 인해 /dev/ttyTTY에서 읽기를 시도하자마자 정지됩니다. fg그러므로 그것은 될 것이다그것프런트 데스크로 돌아갑니다.

다른 직업이 없다는 점을 고려하면 여기서 해결책은 %-or를 사용하는 것입니다.%2


작업이 백그라운드로 전환되면(종료 명령을 사용하여 작업을 시작하거나 &포그라운드 작업 일시 중지를 사용한 Ctrl+Z다음 명령을 실행하여) bg작업에 "작업 ID" 또는 "작업 사양"이 제공됩니다. 이 작업 ID는 일반적으로 소수점 이하 자릿수 %N로 표시됩니다 .N

wait및 등 의 여러 명령과 함께 작업 ID를 사용할 수 있습니다 kill. 예를 들어, 이 명령은 작업 ID를 사용하여 백그라운드 작업에 신호를 보내는 데 사용할 수 있습니다.fgbgkill

기본적으로 이 fg명령은 "현재 작업"에 적용됩니다. 현재 작업의 작업 ID는 %+또는 를 통해 얻을 수 있습니다 %%. 현재 작업은 가장 최근에 시작된 백그라운드 작업이거나 일시 중단된 작업이 있는 경우 가장 최근에 일시 중단된 작업입니다.

백그라운드 작업을 포그라운드로 이동하려면 해당 작업 ID를 사용하세요.

$ sleep 1000 &
[1] 37327
$ sleep 500 &
[2] 83532
$ jobs
[1]-  Running                 sleep 1000 &
[2]+  Running                 sleep 500 &
$ fg %1
sleep 1000

출력 +에서 jobs"현재 작업"을 의미합니다(간단한 호출로 전환한 작업입니다 fg).

POSIX 표준 특수 작업 ID:

  • %%,현재 직업.
  • %+, 같은 상기와.
  • %-,이전 직업.
  • %N, 직업번호 N.
  • %string, 명령이 로 시작하는 작업 string.
  • %?string, 명령에 포함된 작업입니다 string.

답변2

fg명령을 시도해 보셨나요 ?

fg %2

답변3

while에는 $!프로세스 ID가 포함되어 있습니다.최고의최근 백그라운드에서 시작된 작업 프로세스를 파악하기가 어렵습니다.일하다확실한 방법으로 ID를 확인하세요.

작업 ID는 재사용되므로 반드시 가장 큰 작업 ID일 필요는 없습니다. 보류 중인 작업이 우선순위를 갖기 때문에 참조할 수 있는 작업일 필요는 없습니다 %%( %+또는 fg인수 없이 작업이 수행됩니다)(귀하의 경우 첫 번째 작업이 대신 tty에서 읽으려고 하기 때문에 일시중단될 수 있습니다). 또는 가장 최근에 시작된 작업이 종료되었을 수 있습니다(이 경우 %+목록의 다음 작업이 참조됩니다).

jobs따라서 원하는 작업의 작업 번호를 알기 위해 먼저 실행 해야 하며 fg( use 사용), fg %thatnumber이름에 다른 작업이 없는 경우 다음을 실행해야 합니다.zero

fg %\?zero

이를 통해 다음을 zsh사용할 수 있습니다.

fg_most_recent() {
  local job=${(k)jobstates[(R)*:$!=*]}
  ((job)) && fg %$job
}

즉, 값이 패턴과 일치하는 연관 배열을 가져옵니다 k(직접 시작된 작업의 모든 프로세스 상태를 제공하는 것처럼 보입니다).$jobstates*:$!=*$jobstatesrunning:+:20162=running:20163=runningzsh

관련 정보