[1] 写了一个 daemon,通过提交上服务器的 pbs 运行。这里实现用 sed
修改 pbs 脚本中的 daemon ID,以支持批量创建不同 ID 的 daemons 一起薅资源。
pbs script
- 这是送上服务器跑程序的 pbs 模板,语法同 shell,只是开头多了一些配置的命令
- 通过其中
DAEMON_ID
指定 daemon ID,创建相应的 shell pool 目录作为 [1] 的探测路径,并在此运行 [1] - 假设此 pbs 脚本叫 gpu.pbs
#!/bin/bash
#PBS -N daemon-gpu
#PBS -q gpu
#PBS -l nodes=1:ppn=20
#PBS -W x=GRES:gpu@1
#PBS -V
#PBS -S /bin/bash
NP=`cat $PBS_NODEFILE | wc -l`
NN=`cat $PBS_NODEFILE | sort | uniq | tee /tmp/nodes.$$ | wc -l`
cat $PBS_NODEFILE > /tmp/nodefile.$$
cd $PBS_O_WORKDIR
echo begin time: $(date)
# 指定 daemon ID
DAEMON_ID=1 # positive for GPU
# 并为其创建单独的 shell pool
POOL_P=pool${DAEMON_ID}
cd /home/itom/pbs-scripts/daemon
if [ ! -e $POOL_P ]; then
mkdir $POOL_P
fi
# 把 [1] 的 daemon.py 复制去其独享的 shell pool 目录并执行
if [ ! -e $POOL_P/daemon.py ]; then
cp daemon.py $POOL_P
fi
cd $POOL_P
# clean old output & error
python daemon.py
# 一些后续处理
rm ./daemon.py
echo "END" >> END.txt
echo $(date) >> END.txt
echo end time: $(date)
rm -f /tmp/nodefile.$$
rm -f /tmp/nodes.$$
batch daemon creation
当运行多个 daemons 时有个问题:因为要把 pbs 脚本提交上服务器,而不是本地执行,好像不能用命令行参数指定 DAEMON_ID
(因为服务器不会按我想要的方式把参数送给 pbs 脚本执行)。
考虑用另一个 shell(假设叫 do.sh)循环创建。先用 sed
改掉 DAEMON_ID
的赋值,再提交上去:
-i
直接修改文件\{0,\}
表示前面的 pattern(即[0-9]
)至少出现0
次,上不封顶,原来匹配原来的 daemon ID- 改两处:
#PBS -N
后面的名字改掉/加上 daemon ID;DAEMON_ID
赋值一行换成相应 daemon ID - 用法:
sh do.sh gpu.pbs 1 2 4 7 10
,就是依次提交了 5 次 gpu.pbs,daemon ID 分别是 1、2、4、7、10
#!/bin/bash
# 提交 pbs 命令示例
# qsub gpu.pbs
# echo $#
args=($*)
echo ${args[@]}
for i in $(seq 1 `expr ${#args[@]} - 1`); do
echo --- $i, ${args[i]}
# 改名
sed -i "s/\#PBS \-N \([a-zA-Z-]\{1,\}\)[0-9]\{0,\}/\#PBS \-N \1$i/" $1
sed -n '/\#PBS \-N/'p $1
# 改 daemon ID
sed -i "s/DAEMON_ID=[0-9]\{0,\}/DAEMON_ID=$i/" $1
sed -n '/DAEMON_ID=[0-9]\{0,\}/'p $1
qsub $1
done
# qstat 查看 pbs 排队状态
watch -n 1 qstat