at
보류 중인 작업 대기열 에 몇 가지 작업이 있습니다 .
$ atq
28 Wed Oct 31 10:23:00 2018
27 Tue Oct 30 21:20:00 2018
25 Tue Oct 30 21:19:00 2018
26 Tue Oct 30 21:20:00 2018
20 Tue Oct 30 18:25:00 2018
30 Wed Oct 31 10:59:00 2018
32 Wed Oct 31 21:03:00 2018
23 Tue Oct 30 18:28:00 2018
31 Wed Oct 31 13:58:00 2018
19 Tue Oct 30 15:43:00 2018
21 Tue Oct 30 18:27:00 2018
작업번호를 얻어서 삭제하고 싶어요
$ atq | awk '{print $1}'
20
30
32
23
31
19
21
그러나 예상대로 작동하지 않습니다.
$ atq | awk '{print $1}'| atrm ; atq
20 Tue Oct 30 18:25:00 2018
30 Wed Oct 31 10:59:00 2018
32 Wed Oct 31 21:03:00 2018
23 Tue Oct 30 18:28:00 2018
31 Wed Oct 31 13:58:00 2018
19 Tue Oct 30 15:43:00 2018
21 Tue Oct 30 18:27:00 2018
명령 대체를 통해 이 문제를 해결했습니다.
$ atrm $(echo "$(atq | awk '{print $1}')")
파이프라인이 예상대로 작동하지 않는 이유는 무엇입니까 atrm
?
답변1
이것은 당신의 문제와 매우 유사합니다."지정된 날짜에 대기열에서 작업 제거”, 지금을 제외하고는 모든 작업을 삭제하려고 합니다.
제거하다모두at
대기열에 보류 중인 작업은 다음을 사용합니다.
atrm -a
-a
이것이 유효한 옵션이 아닌 시스템에서는 atrm
다음을 사용하십시오.
atq | awk '{ print $1 }' | xargs atrm
awk
파이프라인 중간에 있는 작은 스크립트는 at
출력의 첫 번째 열(작업 ID)을 인쇄하고 atq
이를 인수로 사용하여 실행됩니다 xargs
.atrm
이는 다음과 거의 같습니다.다른 질문에 대한 내 대답print $1
무조건 시행된다는 점만 빼고요.
이유
atq | awk '{ print $1 }' | atrm
작동하지 않는 이유는 atrm
작업 ID를 표준 입력에서 읽지 않기 때문입니다. 명령줄에 ID가 필요합니다.
"수정"은 두 개의 중첩된 명령 대체를 사용하는 것입니다.
atrm $( echo "$( atq | awk '{ print $1 }' )" )
이는 단일 명령 대체를 사용하는 것으로 줄일 수 있습니다( echo $(...)
이 경우 대체에서 명령을 실행하는 것과 동일, 아무것도 없음 echo
).
atrm $( atq | awk '{ print $1 }' )