【问题标题】:Getting last process' PID in Makefile在 Makefile 中获取最后一个进程的 PID
【发布时间】:2011-04-24 01:17:50
【问题描述】:

我的 Makefile 看起来像这样:

setsid ./CppServer>daemon.log 2>&1 &
echo $!>daemon.pid

我期望它做的是将 my_awesome_script 的 PID 存储在相应的文件中。然而那里什么都没有。那么问题出在哪里?

【问题讨论】:

    标签: makefile pid


    【解决方案1】:

    如果你的 makefile 真的像这样你会得到一个错误,因为我没有看到任何实际的 make 语法,只是 shell 语法。然而,我的水晶球告诉我,这两行可能是规则的一部分。如果是,您应该了解 make 如何执行配方;为每一行创建一个单独的子shell,其中该行的命令独立执行:您的两个命令对彼此的环境一无所知。如果你想在同一个子shell中执行两个命令,你应该将它们作为一行发出(必要时使用行继续符),或者使用make的ONESHELL指令。

    【讨论】:

    • 这没有帮助。告诉我:为什么是美元!在 Makefiles 中询问时为空?
    • @nalply:它是空的,因为 make 没有定义具有该名称的变量。如果你想在 shell 中使用它,你必须转义美元符号:$$!,但你必须注意我关于在一行上发出命令的评论,用例如分隔。分号。
    • @eriktous 很好的答案,绝对有帮助。接下来我确实遇到了nalply的问题,当然是$$!解决了。​​
    【解决方案2】:

    您尝试使用的变量会打印在后台运行的最后一个程序的 pid。它正确地写为 echo $! > 文件名.扩展名。但是由于您在前台运行它,因此您有两个选择。通过在 ./script_to_run & 行的末尾附加一个 & 来在后台运行它,或者您可以使用 echo $$ > filename.extension 让脚本本身打印以归档当前正在运行的进程的 pid(在脚本内)。这是一个可能对您有帮助的链接http://tldp.org/LDP/abs/html/internalvariables.html

    【讨论】:

    • 内部变量前面不需要额外加$。
    • 对不起,我在问题中提供的 Makefile 的内容与实际 Makefile 中的内容不同(我确实在后台运行了脚本)。不过现在是这样。
    • 我正在运行一个程序,而不是脚本,并且我正在将 & 附加到调用中。但是美元!仍然是空的。那么现在怎么办? :-)
    • @nalply: 还要加上`; \` 到调用。
    猜你喜欢
    • 2012-09-15
    • 2012-02-27
    • 1970-01-01
    • 2018-05-30
    • 2023-03-11
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多