1

我在一个研究小组工作,我们使用 PBS 排队系统。我不是 PBS 大师,但我想编写脚本搜索是否有作业正在运行。为此,我首先使用 qstat 调用的结果作为 qstat -f 的参数来获取所有作业的字符串,然后获取所有作业的详细列表并在其中搜索提交的文件路径。当前的kludge如下

dump=`qstat -f `qstat``
if grep -q \
          "/${compounds[$i]}/D0_${j}_z_$((k*30))/scripts/jobscript_minim" \
      <<<$dump; then
      echo "Minimize is running!"
fi

改进建议?

另外,有人告诉我 $() 比 `. 但是当我尝试时:

dump="$(qstat -f "$(qstat)")"

...我的程序失败了。为什么是这样?我是否误解了如何使用 $() 嵌套 shell 调用?还是与我将队列作业列表从 qstat 传递到 qstat -f 的方式有关?我是否应该使用 awk 或其他东西从 qstat 命令中获取作业,然后以某种方式将它们作为 args 传递给 qstat -f?

我还应该使用递归grep吗?有些人告诉我它“更理智”,但我不确定这意味着什么。是不是更便携?它更快吗?它需要更少的治疗师旅行吗?

你应该使用它的原因是什么?

4

4 回答 4

1

好吧...设法想出了一个干净的解决方案...

search_dir="${compounds[${i}]}/D0_${j}_z_$[30*k]"
if [ ! -z "$(qstat -f $(qstat | grep -F jmick | awk '{print $1}')|\
      grep -F "$search_dir"|head -n 1)" ]
      then

...因为我正在搜索的目录有点长,所以我将它分配给一个变量。我运行内部命令替换以仅获取具有我的用户名的作业,然后运行外部命令替换以打印有关这些作业的完整详细信息,然后通过 grep 搜索我的目录的这些详细信息。万一它发现它早我包括一个头试图短路命令。

但是,递归 grep 有什么意义的问题仍然存在。

于 2010-08-25T19:26:06.393 回答
1

递归grep将搜索所有子目录中的多个文件。如果不使用递归,它将仅在当前(或指定)目录中搜索一个或多个文件。我看不出一个人会比另一个人更“理智”。它们各有其特定的应用。

顺便说一句,你真的应该把你的问题分解成具体的问题,而不是把它们放在一起——即使它们有一些共同点。当你这样做时,这个网站会更好地工作。

于 2010-08-25T19:48:56.407 回答
0

尝试不带引号:

dump=$(qstat -f $(qstat))
于 2010-08-25T16:20:16.487 回答
0

dump=`qstat -f `qstat``等价于dump=$(qstat -f )qstat$()等价于dump="$(qstat -f)qstat"

qstat -f "$(qstat)"使用两个参数调用qstat: option-f和来自的输出qstat集中在一起作为一个单词。dump="$(qstat -f "$(qstat)")"设置dump为外部qstat命令的输出。

qstat -f $(qstat)使用从 1 开始的任意数量的参数进行调用qstat,具体取决于 的输出qstat:首先,在qstat每个空白序列处将输出的file 被匹配的文件名列表替换。所有这些单词和文件名都成为外部的单独参数。*?[qstat

于 2010-08-25T19:21:04.550 回答