셸에서 현재 작업 뒤에 여러 작업을 대기열에 넣습니다.

셸에서 현재 작업 뒤에 여러 작업을 대기열에 넣습니다.

존재하다 더 일찍 질문내 것과 마찬가지로 제안된 솔루션은 모두 Ctrl+를 사용하여 현재 포그라운드 작업을 일시 중지 Z한 다음 실행 fg && ...하거나 ( 새 명령을 입력하는 동안 계속 실행할 수 있도록 fg ; ...이전 작업을 먼저 백그라운드로 보내는 것입니다 ).bg

적어도 나에게 이것은 대기 중인 단일 명령에만 작동합니다. 이 트릭을 연속해서 여러 번 사용하려고 하면 그 사이에 있는 명령이 잊어버립니다.

$ sleep 60 && echo test1

^Z
[1]  + 2336348 suspended  sleep 60

$ fg && echo test2
[1]  + 2336348 continued  sleep 60

^Z
[1]  + 2336348 suspended  sleep 60

$ fg && echo test3
[1]  + 2336348 continued  sleep 60

test3

How 는 test1결코 인쇄되지 않는다는 점에 유의하십시오. (비록 이를 받아들일 수는 있지만 초기 명령이 두 개로 구성되어 있고 명령이 sleep 60완전히 실행되기 때문에 이것이 제가 가장 중요하게 생각하는 것입니다.) 게다가 어떻게 test2인쇄되지 않는지 확인하세요. 이것은 나의 두 번째 명령이며 나는 그것이 실행된 적이 없다고 믿습니다.

내가 원하는 것은 내가 방금 생각한 다른 명령을 대기열에 추가하여(다른 명령이 실행되는 동안) 현재 명령 이후와 이전에 대기열에 추가한 다른 모든 명령 이후/앞에서 실행되도록 하는 것입니다. 명령의 순서는 궁극적으로 중요하지 않지만 공통 상태(파일 시스템 등)에 의존하기 때문에 동시에 실행할 수 없습니다(그렇지 않으면 다른 셸을 열고 그곳에서 실행할 수 있습니다).

당신의 도움을 주셔서 감사합니다!

답변1

GNU/Linux 시스템을 사용 중이거나 coreutils가 설치되어 있는 경우 다음을 사용하십시오.무리(1)(어쩌면 실행 파일/명령 자체를 잠금 파일로 사용할 수도 있습니다):

% cat linger
echo -n $$; date +%s; sleep $1

% flock ./linger ./linger 8 &
[3] 5941
% 59421598557788

% flock ./linger ./linger 9 &
[4] 5945
% flock ./linger ./linger 11 &
[5] 5946
% 59471598557796
59501598557805

[3]   Done                    flock ./linger ./linger 8
[4]   Done                    flock ./linger ./linger 9
[5]   Done                    flock ./linger ./linger 11

셸에서 명령을 중지하면 0이 아닌(실패) 상태로 즉시 종료된 것처럼 보이기 때문에 수행하려는 작업이 작동하지 않습니다.

% sleep 10 || echo FAIL
^Z
[3]+  Stopped                 sleep 10
FAIL
% fg
sleep 10
% echo $?
0

관련 정보