nq를 이용한 command line queueing

최근 Pipeline으로 여러가지를 스캐닝해줄 도구를 만들고 있는데, 해당 구간에서 사용할 큐에 대해 고민하던중 심플한 툴이 있어서 공유해봅니닷.. (사실 장인정신으로 한땀한땀 서비스를 분석하는걸 즐기지만, 슬슬 개인적인 영역에도 자동화의 필요성을 점점 느끼고 있네요..)

처음엔 RabbitMQ를 생각했었는데, 간단한 큐잉을 위해서 저거까지 써야하나 고민이 들었습니다. 그래서 생각을 정리한걸론 직접 만들자 vs 좀 더 찾아보자 였고 찾아본 결과 nq와 pueue로 압축되었습니다. 둘 다 간단한 툴이며, 그냥 개인적인 환경 구성 상 nq가 깔끔하게 설치되길래 nq로 정했습니다. (만드는게 베스트이긴한데, 할 일은 산더미..)

Installing nq

# if on linux
apt install nq

# if on Mac
brew install nq 

리눅스 패키지 관리자들(apt, yum, pacman 등)을 지원하고 HomeBrew 또한 지원하기 때문에 상대적으로 설치가 쉽습니다. 사실 Pueue도 Cobra로 바로 설치가 가능하지만, 테스트한다고 Rust 개발 환경 때문에… 좀 에러가 있습니다.

nq
usage: nq [-q] [-w ... | -t ... | CMD...]

Usage

자 … -h--help를 봐도 똑같습니다. 정보를 정말 안줍니다. 구글링해서 옵션을 정리해봅시다.

nq

nq
usage: nq [-c] [-q] [-w ... | -t ... | CMD...]

nq [your commands]
-q : nq는 기본적으로 job id를 리턴해줍니다. -q 옵션으로 안보이게 끌 수 있습니다. 
-c : job을 모두 지웁니다(clean jobs)
-w : job이 완료까지 대기합니다. 
-t : 대기하는 job이 있느지 테스트합니다.

fq

fq 현재 실행 중인 작업의 로그를 출력하여 작업이 완료되면 종료하는 보조적인 툴입니다.

fq [your job id]

-a : 모든 job의 결과 출력
-n : 기다리지 않습니다 (no wating)
-q : job 당 하나의 행만 출력

Test

간단하게 테스트해봅니다. nq에 2가지 job을 추가합니다. (sleep 10, 5) 그럼 sleep 10이 우선 실행되고 해당 명령이 완료되면 sleep 5가 실행됩니다. fq로 출력을 받았기 때문에 10초 후에 맨 아래 구문이 찍힙니다.

nq sleep 10
,16f134fd88a.32350

nq sleep 5
,16f134fde8c.32353

fq -q
==> ,16f134fd88a.32350 exec 'nq' 'sleep' '10'
==> ,16f134fde8c.32353 exec 'nq' 'sleep' '5'

Conclusion

사실 nq 자체가 기능이 많진 않아서 직접 짜는게 더 편할수도 있습니다. (확장성 측면에서) 다만 간단한 작업에는 이만한 도구가 없는 것 같은데, 잘 활용하면 여러가지 포인트로 사용할 수 있을 것 같네요 :)

Reference

https://github.com/leahneukirchen/nq https://github.com/leahneukirchen/nq/commit/381576322800ee3afe3246fadaf74d61377951ba https://github.com/leahneukirchen/nq/commit/871185b1ba7e1cfb41be9290e9c166190b7b1a5d