【问题标题】:Checking for status of qsub jobs running within shell script检查在 shell 脚本中运行的 qsub 作业的状态
【发布时间】:2019-08-09 06:08:37
【问题描述】:

我收到了一个 c shell 脚本,它启动了 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

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

【问题讨论】:

    标签: bash shell loops qsub


    【解决方案1】:

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

    一个小改进: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
    

    【讨论】:

      猜你喜欢
      • 2013-01-05
      • 2022-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多