【问题标题】:How to get the process id of command executed in bash script?如何获取在 bash 脚本中执行的命令的进程 ID?
【发布时间】:2014-02-27 05:26:36
【问题描述】:

我有一个脚本我想同时运行2个程序,一个是ac程序,另一个是cpulimit,我想先用“&”在后台启动C程序,然后得到PID C 程序并将其交给 cpulimit,cpulimit 也将使用“&”在后台运行。

我尝试在下面这样做,它只是启动第一个程序,从不启动 cpulimit。

我也在 Arch linux 中使用 systemd 作为启动脚本以 root 身份运行它。

#!/bin/bash

/myprogram &

PID=$!

cpulimit -z -p $PID -l 75 &

exit 0

【问题讨论】:

  • sleep 30 & PID=$! sleep $PID & ps -f 适合我。
  • 我认为 $!是最后执行命令的 id,通过使用变量 PID,我可以访问该值吗?
  • 是的,在我的代码输出中(缺少换行符)有两个分叉进程。第一个是 sleep 30,第二个是 sleep 17568,它与第一个 sleep 的 pid 匹配。也许你的 myprogram 是一个分叉另一个进程的 shell?
  • 您可能想要选择不同的变量名称。 MY_PID=$!
  • cpulimit 是做什么的?这听起来像是完成得相当快的事情,所以它可能在后台运行并在启动脚本完成后您可以检查它之前退出。

标签: linux bash shell sh systemd


【解决方案1】:

我想我现在已经解决了这个问题,根据这里:link 我需要包装这样的命令(命令)来创建一个子 shell。

#!/bin/bash

(mygprgram &)
mypid=$!
(cpulimit -z -p $mypid -l 75 &)

exit 0

【讨论】:

  • 不需要生成一个子shell来启动后台进程。
【解决方案2】:

我在谷歌搜索时发现了这个并想添加一些东西。

虽然您的解决方案似乎有效(请参阅有关子shell 的 cmets),但在这种情况下,您根本不需要获取 pid。只需像这样运行命令:

cpulimit -z -l 75 myprogram &

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2021-02-12
    • 2020-12-08
    • 1970-01-01
    • 2012-04-13
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多