在Linux中一个接一个地调度作业

时间:2013-08-05 13:11:10

标签: linux bash shell job-scheduling

我编写了一个脚本After.sh来推迟在另一个正在运行的作业完成后启动的一个作业:

echo "Waiting job $1 to be finished..."
while ps -p $1 >/dev/null; do sleep 1; done ;
echo "Job $1 finished."
echo "Now running job ${*:2}..."
${*:2}
echo "Job ${*:2} finished."

我在{= 1}}之后运行它以在PID = 5327的作业完成后关闭PC。即使我可以像After.sh 5327 shutdown 0一样运行它,这样它会等到所有作业5327 5778和5935首先完成。

我的问题是当我想要将更复杂的作业作为参数提供给脚本时,例如:

After.sh "5327 5778 5935" shutdown 0

现在它运行时出现错误:After.sh 5327 for f in *; do echo $f; done 。我尝试将脚本中的命令for: command not found替换为${*:2}sh ${*:2},但是它们失败了(eval ${*:2}再次失败,找不到sh命令,{{1保留整个循环的for的第一个值,因此每次都打印第一个文件的名称。)

你知道如何解决它吗?

1 个答案:

答案 0 :(得分:2)

问题是,你for f in *; do echo $f; done不是命令,而是 bash -code,需要一个bash-interpreter来执行。

您可以使用eval

开始翻译
#!/bin/sh

PID="$1"
shift
JOB="$@"

echo "Waiting job ${PID} to be finished..."
while ps -p ${PID} >/dev/null; do sleep 1; done ;
echo "Job ${PID} finished."
echo "Now running job '${JOB}'"
eval ${JOB}
echo "Job '${JOB}' finished."

然后对命令使用单引号,包括应由After评估的变量:

./After.sh 123 'for f in *; do echo $f; done'