我得到了一个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
提前感谢您的帮助。如果需要更多信息,请告诉我。
您的脚本确实应该按原样工作。逻辑合理,语法正确。
一个小的改进: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