내가 이걸 하고 싶은지 미리 몰랐어, 한 작업이 완료될 때까지 기다렸다가 자동으로 다른 작업을 시작할 수 있습니까?
예를 들어, tmux 세션으로 이동하여 sudo apt update && sudo apt upgrade
. 업데이트/업그레이드 프로세스가 완료될 때까지 기다려야 하지만 느리게 진행되고 있어서 기다리고 싶지 않습니다. 특히 진행되는 동안 기다리지 않고 다른 작업을 수행할 수 있기 때문에 더욱 그렇습니다.
나는 이것을 잘 작동 ^Z
시킬 수 있지만 bg
내 질문은, 해당 작업이 완료된 후에 작업을 삽입하여 && sudo apt install tree
예를 들 수 있는 방법이 있습니까? 입니다.
편집: 이 질문은 연결된 질문 및 답변과 다르다고 생각합니다. 왜냐하면 job1 && job2
^Z
fg; echo "done"
완료 echo "done"
후에 실행될 것이기 때문입니다 job1
. job2
분명히 삭제됩니다. 해결 방법은 job1
과 사이에 세미콜론을 사용하는 것이지만 job2
이는 나에게 좋은 해결책이 아닙니다.
답변1
일반적으로 말해서, 주어진 것보다 더 나은 해결책은 없습니다기본 작업 제어: 작업 중지, 스택에 작업 추가 및 "fg"하지만 지적했듯이 with를 사용하면 실패하고 &&
(백그라운드에 배치된 명령이 0이 아닌 상태 코드로 "종료"되었기 때문에) 복합 명령이 항상 원하는 효과를 얻지는 못합니다(현재 실행 중인 명령이 배치됨). 백그라운드에서 즉시 다음 명령을 실행합니다).
이 특정 사용 사례에는 해결책이 있습니다. Diomidis Spinellis를 사용할 수 있습니다.lockf.py
apt
현재 명령이 완료되기를 기다리는 명령 대기열을 만듭니다.
lockf /var/lib/apt/lock apt install tree
이는 예측 가능한 방식으로 외부에서 완료를 관찰할 수 있는 모든 명령으로 일반화될 수 있습니다.
대기열이 정렬되지 않아 다음을 실행하면 문제가 발생할 수 있습니다.
sudo apt update && sudo apt upgrade
설치가 실행되는 동안 큐에 대기하면 잠금을 얻을 수 없기 때문에 결국 실행 되고 실패 apt update
할 수 있습니다 .apt install
apt update
apt upgrade
답변2
flock(1)
Linux의 유틸리티(또는 lockf.py
다른 운영 체제의 스크립트) 사용답변, 이는 이와 유사함)은 "대기열에 있는" 명령이 제출된 순서대로 실행된다는 것을 보장하지 않습니다.
$ sh -c 'for i in 1 2 3 4 5 6 7 8 9; do sleep .1; flock / sh -c "echo $i; sleep .3" & done; wait'
1
2
3
5
4
...
작업 대기열 생성에 대한 어리석은 "해결책"은 다음과 같습니다.
$ (echo > jobq; tail -f jobq | sh) &
[2] 6641
$ echo echo 1 >> jobq
1
$ echo echo 2 >> jobq
$ 2
etc
답변3
당신은 사용해야합니다작업 스풀러( tsp
아님 ts
) 여러 apt
명령을 실행합니다.
tsp apt command 1 -y
그런 다음 옵션을 사용하여 -d
두 번째 apt
명령을 대기열 목록에 추가합니다.
tsp -d apt command 2 -y
목록 확인을 위한 tsp
통계입니다 .
ts
사용자별 UNIX 작업 대기열이 기본적으로 실행됩니다. 사용자는 대기열에 명령을 추가하고 언제든지 대기열을 관찰하며 작업 결과(실제로는 표준 출력 및 종료 오류)를 볼 수 있습니다.
-d
이 명령은 이전 명령이 성공적으로 완료된 경우에만 실행됩니다(오류 수준 = 0). 대기열에 추가된 새 작업은 이전 명령의 결과에 따라 달라집니다. 작업이 실행되지 않으면 추가 종속성은 실패한 것으로 간주됩니다.
답변4
항상 업데이트/업그레이드하는 습관을 들이신다면,
( sudo apt update && sudo apt upgrade )
그러면 작업 제어가 하위 프로세스를 올바르게 일시 중지하여 다음을 입력할 수 있습니다.
fg ; echo "Example new command"