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

标签 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."

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

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

After.sh 5327 for f in *; do echo $f; done

现在它运行时出现错误:for: command not found。我试图将脚本中的命令 ${*:2} 替换为 sh ${*:2}eval ${*:2} code>,但它们失败了(sh 再次找不到 for 命令,eval 保留了 $f 的第一个值> 对于整个循环,所以每次都打印第一个文件的名称。)

你知道怎么解决吗?

最佳答案

问题是,你 for f in *;做 echo $f; done 不是命令,而是bash代码,需要bash解释器才能执行。

您可以使用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'

关于linux - 在 Linux 中一个接一个地调度作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18059003/

相关文章:

linux - SSL 和 Tkinter 不存在于 Python 3.5.2、Debian Linux 的源代码构建中

bash - 如何使用 bash 将文件的内容放入变量中

R - 具有多个管道的系统命令不返回标准输出

linux - 通过 bash 脚本从文本文件运行命令

linux - 我不明白 break 命令

linux - 脚本在后台运行时如何检查wget正在下载哪个文件?

linux - 在 Bash 条件语句中使用 Conky execpi 变量

linux - 将文件转换为 html 到位

python - 虚拟环境和基础环境同时激活

c - 在 Shell 脚本或 Perl 脚本中对单词进行排序,然后对包含数字和字符的句子进行排序