これが問題です。hpcにあるジョブの数を数えたいのですが、これはすぐに提供される機能の1つではありません。だから私はこの簡単なスクリプトを作りました
squeue -u user_name | wc -l
ここで、squeue
は次のようなすべてのジョブを出力します
> squeue -u user_name
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
8840441 theory cteq fxm PD 0:00 1 (Resources)
8840442 theory cteq fxm PD 0:00 1 (Priority)
8840443 theory cteq fxm PD 0:00 1 (Priority)
8840444 theory cteq fxm PD 0:00 1 (Priority)
これはwc
にパイプされ、行数がカウントされます。ただし、最初の行はジョブのエントリではありません。カウント時に最初の行をスキップするようにwc
にどのように指示できますか?それとも、wc
の出力から1を引いた方がいいでしょうか。
前もって感謝します!
これを行うには多くの方法がありますが、私が最初に考えたのは:
squeue -u user_name | tail -n +2 | wc -l
tail
のmanページから:
-n, --lines=[+]NUM output the last NUM lines, instead of the last 10;
or use -n +NUM to output starting with line NUM
したがって、-n +2の場合、最初の行をスキップする必要があります。
末尾のソート形式を使用することもできます:tail +2
-h
-オプションを使用して、squeue
のヘッダー行を抑制することができます。これにより、最初の行を削除する必要がなくなります。
squeueのmanページ から:
-h, --noheader
Do not print a header on the output.
ちょうど楽しみのために。あなたはトイレの出力から1を演習することができます
echo $(( $(squeue -u user_name|wc -l)-1 ))
または
squeue -u user_name|wc -l|awk '{print $0-1}'
Awkを使用すると、awkで行を数えることができるので、wcを避けます
squeue -u user_name|awk 'END{print NR-1}'
ENDは、すべての行が読み取られた後に次のブロックが実行されることを意味し、NRは、これまでに読み取られた行数を意味します。
実際、同じ結果を得るにはいくつかの方法があります。もう1つの方法は、次のように、sequenceコマンドの出力をsedにパイプすることです。
squeue -u user_name | sed '1d' | wc -l