服务器跑 pbs 脚本的时候,会分配一个 job ID,并相应地创建两个文件 <NAME>.o<ID> 和 <NAME>.e<ID> 来分别装标准输出和错误输出。当提交了多个 pbs 脚本(如通过 [1] 批量创建)时,有些先跑完、有些还在跑。
[2] 的 Example 1 写过一种无脑全删的命令,但现在要根据 job ID 仅删掉那些已经跑完的 pbs jobs 的 log 文件。qstat
可以查目前正在跑、等的 pbs jobs,输出形如:
Job ID Name User Time Use S Queue
------------------------- ---------------- --------------- -------- - -----
154497.mu01 daemon-gpu1 iTom 28:01:37 R gpu
154498.mu01 daemon-gpu2 iTom 0 Q gpu
只取 Job ID
一列中的数字(假设 job ID 不会重复)。而 log 文件名形如:daemon-gpu1.e154497 和 daemon-gpu1.o154497。
Code
$?
是函数返回值,即同「上一条命令」的返回值。可能会被当成 error code?是的话就不能用set -e
#!bin/bash
# 指定根目录
P=$1
P=${P:="."} # 默认当前目录
# 无脑全删
# ls -d ./* | grep -E "*.[oe][0-9]+" | xargs rm
# 找 log 文件
log_files=$(ls -d $P/* | grep -E "*.[oe][0-9]+")
# echo ${log_files[@]}
if [ ${#log_files[@]} -eq 0 ]; then
exit
fi
# 通过 `qstat` 找正在跑、等的 pbs job IDs
# 保留它们对应的 log 文件
running_id=$(qstat | awk '{if((NR>2)) {print $1}}' | sed 's/\([0-9]\{0,\}\)\..*/\1/')
# echo ${running_id[@]}
# 判断一个 ID 是否 running IDs 之一
exist()
{
for _rid in ${running_id[@]}; do
if [ $_rid == $1 ]; then
return 1
fi
done
return 0
}
# 逐 log 操作
for f in ${log_files[@]}; do
# 该 log 文件的 ID
id=$(basename $f | sed 's/[^\.]*\.[eo]\([0-9]\{0,\}\)/\1/')
# echo $id
exist $id
if [ $? -eq 0 ]; then
# echo delete: $f
rm $f
fi
done