lsf에서 많은 bjob이 실행되고 있으며 작업에는 RUN과 PEND라는 두 가지 상태가 있습니다. PEND 상태에 있는 모든 bjob을 종료하고 싶습니다. 스크립트를 사용하여 이 작업을 어떻게 수행할 수 있습니까? 내 생각에 하드코딩된 접근 방식은 파일에 저장한 다음 각 줄을 구문 분석하여 상태와 키를 얻는 것입니다. STAT가 PEND이면 키가 에 전달됩니다 bkill $key
. 하지만 이것은 매우 복잡합니다. 이 작업을 직접 수행하거나 하드코딩되지 않은 방식으로 특정 상태나 이름을 가진 작업을 종료할 수 있는 bkill 함수가 있습니까?
답변1
bjobs
보류 중인 작업만 나열할 수 있습니다 -p
. 모든 사용자에 대해 보류 중인 작업을 제거하는 작업을 필터링하는 것도 가능 하다면 bkill -p
좋을 것입니다 bkill -p 0
.
내가 생각할 수 있는 가장 좋은 것은 쉘 마법이다. 완벽하지는 않지만 많은 상황을 다루어야 합니다. 예를 들어,
bkill `bjobs -p -o id -noheader | tr '\n' ' '`
bjobs -p -o id -noheader
사용자의 보류 중인 작업의 작업 ID를 나열합니다. tr
예상되는 형식으로 변환됩니다 bkill
. 한 가지 잠재적인 문제는 작업 목록이 너무 길면 최대 명령줄 길이 또는 최대 명령줄 인수 수가 초과되어 bash가 불만을 표시한다는 것입니다.
여기에는 작은 경쟁 조건이 있습니다. 작업은 쿼리 사이에 시작되고 종료될 수 있습니다.
답변2
또 다른 솔루션(이전 답변과 같이 쉘 필터를 사용하지만 허용되는 쉘 명령 인수 수를 초과할 위험은 없음):
bjobs -w | grep 'PEND' | awk '{print $1}' | xargs bkill
기본적으로 실행 중인 작업을 확인하고(-w 와이드 형식, 자르지 않음) grep
보류 중인 작업을 필터링하는 데 사용한 다음 "매개변수 목록이 너무 깁니다" 오류를 awk
사용하여bkill