【问题标题】:Getting a Process ID & Assigning to a Variable in a Bash Script在 Bash 脚本中获取进程 ID 并分配给变量
【发布时间】:2013-05-01 00:54:54
【问题描述】:

我有一个有趣的情况。这里的所有代码都是我所面临的确切问题的功能性伪代码示例,所以不要开玩笑分配date 的输出。我实际上想捕获一个更慢、更依赖资源的函数的输出,但date 可以很好地显示我遇到的功能障碍。

我正在编写 bash 脚本,我想将进程的输出分配给一个变量,如下所示:

RESPONSE=$(nice -n 19 date);

现在这给了我一个很好的变量RESPONSE,对吧?好的,如果我想获取在$() 中调用的函数的进程ID 怎么办?我该怎么做?我认为这会起作用:

RESPONSE=$(nice -n 19 date & PID=(`jobs -l | awk '{print $2}'`));

这确实给了我变量 PID 中的进程 ID,但是我不再将输出发送到 RESPONSE

我用作功能示例的代码是这样的。这个例子有效,但没有PID;是的,我没有分配PID,但这又是一个例子:

RESPONSE=$(nice -n 19 date);
wait ${PID};
echo "${RESPONSE}";
echo "${PID}"; 

这个例子给了我一个PID,但没有RESPONSE

RESPONSE=$(nice -n 19 date & PID=(`jobs -l | awk '{print $2}'`));
wait ${PID};
echo "${RESPONSE}";
echo "${PID}";

任何人都知道如何使用PID 获得RESPONSE 的值吗?

【问题讨论】:

  • 这在我看来就像你已经决定了如何做某事,但事情并不明显。我们需要描述您需要做什么,而不是您认为应该如何做。假设这里的某个人已经知道如何做你真正想做的事,而不是你告诉我们你认为你应该做的事......所以如果你告诉我们,那么你会得到一个有效的答案。我们现在所处的位置对您没有任何帮助。
  • 吉姆,我想完全按照脚本显示的那样做。我想获取进程 ID,然后让脚本等待该进程结束,然后再继续下一步。但是——如果 Luis 说的是真的——那么也许简单地将函数包装在 $() 中就足以确保在分配变量之前不会发生下一步?

标签: bash shell unix scripting


【解决方案1】:

根据您的具体设置方式,使用 RESPONSE=$(backgroundcommand) 将等待命令完成(在这种情况下获取其 PID 为时已晚),或者不会等待要完成的命令(在这种情况下,它的输出将不存在,并且不能分配给 RESPONSE)。您将不得不将命令的输出存储在其他地方(如临时文件),然后在进程完成时收集它:

responsefile=$(mktemp -t response)
nice -n 19 date >$responsefile &
pid=$!
wait $pid
response=$(<$responsefile)
rm $responsefile

(请注意,$(&lt;$responsefile) 构造仅在 bash 中可用,而在普通的 posix shell 中不可用。如果您不使用 #!/bin/bash 启动脚本,请改用 $(cat $responsefile)。)

这仍然可能无法完全满足您的需求,因为(至少据我所知)您正在寻找的东西并没有真正的意义。该命令的 PID 和输出永远不会同时存在,因此获取两者并没有真正的意义。我在上面给出的脚本在技术上给了你两个,但是 pid 在分配响应时是不相关的(进程已经存在),所以当你最后的 pid 时,它是没有意义的。 p>

【讨论】:

  • 您的解释对我来说最有意义。感谢您花时间提供有效的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 2012-06-18
相关资源
最近更新 更多