检查在外壳脚本中运行的 qsub 作业的状态



我得到了一个cshell 脚本,它为一个样本启动了 800 个单独的qsubs。我需要在 500 多个样本上运行此脚本(在samples.txt中列出(。为了自动化该过程,我想使用以下 bash shell 脚本运行脚本(名为SrchDriver(:

#!/bin/sh
for item in $(cat samples.txt)
do
(cd dir_"$item"/MAPGAPS && SrchDriver "$item"_Out 3)
done

此脚本将依次启动所有示例的SrchDriver脚本,这将导致服务器上一次出现过多作业。我想一次只运行一个样本,等待特定样本的所有qsubs完成。

检查样本的运行/等待作业并保留其他样本的Srchdriver脚本的启动,直到当前样本的所有作业完成的最佳方法是什么?

我想先等待 30 秒,然后检查qsubs的状态(作业名称为mapgaps(。接下来,我想使用 while 循环每 30 秒检查一次状态。一旦状态不再为 0,则继续下一个示例。这是正确的吗?

sleep 30
qstat | grep mapgaps &> /dev/null
while [ $? -eq 0 ]; 
do
sleep 30
qstat | grep mapgaps &> /dev/null
done;

如果正确,我将如何将其与我的 for 循环相结合?下面的代码是否正确?

#!/bin/sh
for item in $(cat samples.txt)
do
(cd dir_"$item"/MAPGAPS && SrchDriver "$item"_Out 3)
sleep 30
qstat | grep mapgaps &> /dev/null
status=$?
while [ $status = 0 ]
do
sleep 30
qstat | grep mapgaps &> /dev/null
status=$?
done
done

提前感谢您的帮助。如果需要更多信息,请告诉我。

您的脚本确实应该按原样工作。逻辑合理,语法正确。

一个小的改进:while语句可以直接获取命令的返回状态,而无需使用$?,因此您可以像这样编写脚本:

#!/bin/sh
for item in $(cat samples.txt)
do
(cd dir_"$item"/MAPGAPS && SrchDriver "$item"_Out 3)
sleep 30
while qstat | grep mapgaps &> /dev/null
do
sleep 30
done
done

最新更新