이 두 가지 프로세스는 다음과 같습니다.
cat /dev/tty > /dev/null &
cat /dev/zero > /dev/null &
백그라운드에서 실행해야 하는데 두 번째 작업을 포그라운드로 가져올 수 없습니다.
답변1
이것이 두 개의 일반 작업인 경우 aa plain은 fg
두 번째 작업을 포그라운드로 가져옵니다(이 작업이 최근에 일시 중지된 백그라운드 작업이거나 최근에 시작된 백그라운드 작업인 경우(다른 작업은 일시 중지되지 않음)).
그러나 첫 번째 작업(읽기)의 특성으로 인해 /dev/tty
TTY에서 읽기를 시도하자마자 정지됩니다. fg
그러므로 그것은 될 것이다그것프런트 데스크로 돌아갑니다.
다른 직업이 없다는 점을 고려하면 여기서 해결책은 %-
or를 사용하는 것입니다.%2
작업이 백그라운드로 전환되면(종료 명령을 사용하여 작업을 시작하거나 &
포그라운드 작업 일시 중지를 사용한 Ctrl+Z다음 명령을 실행하여) bg
작업에 "작업 ID" 또는 "작업 사양"이 제공됩니다. 이 작업 ID는 일반적으로 소수점 이하 자릿수 %N
로 표시됩니다 .N
wait
및 등 의 여러 명령과 함께 작업 ID를 사용할 수 있습니다 kill
. 예를 들어, 이 명령은 작업 ID를 사용하여 백그라운드 작업에 신호를 보내는 데 사용할 수 있습니다.fg
bg
kill
기본적으로 이 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
*:$!=*
$jobstates
running:+:20162=running:20163=running
zsh