【问题标题】:Wait for a process launched by another program to terminate等待另一个程序启动的进程终止
【发布时间】:2014-10-21 06:41:46
【问题描述】:

所以我正在创建一个快速脚本,该脚本基本上启动 xboxdrv,然后是来自 Steam 的游戏以启用控制器支持。是的,虽然大多数支持控制器的游戏会自动与 Xbox 360 控制器配合使用,但有些游戏需要您在 xpad 驱动程序下运行控制器,否则由于某种原因它无法识别控制器。有问题的游戏是 Linux (XUbuntu) 上的 Bit.Trip Runner 2。

我遇到的问题是试图让脚本等待游戏退出(因为它是由 Steam 自己的命令启动的),然后终止 xboxdrv 以释放内存,但发生的事情是当游戏退出,我必须进入终端并按 Ctrl+C 才能移动它。

如果可能,请通俗地解释一下,因为这是我第一个完整的 linux 批处理脚本。以下是有问题的脚本:

sudo --validate
sudo xboxdrv --silent --detach-kernel-driver --mimic-xpad --dbus session & sleep 2
steam steam://rungameid/$APPID #<-- I want the game to exit to then kill xboxdrv
wait -n $!  #<-- If I don't put wait, it will immediately kill xboxdrv after the game launches
sudo killall xboxdrv
exit 0

【问题讨论】:

  • 欢迎来到 StackOverflow。如果您可以将(否则完整的)shell 脚本缩减为仅几行没有按照您的意愿执行的操作,这可能是最好的。这样一来,您就会吸引更多有兴趣帮助您的人。
  • 是的,很抱歉。当我发布这个问题时,我已经半睡半醒了。只是想知道,如果我使用 pgrep 搜索进程的 pod,然后告诉 wait 等待该 ID,它会起作用吗?

标签: linux bash steam


【解决方案1】:

好吧,问题似乎在于wait 没有正确应用,这与子进程有关。如果不是它在等待xboxrdv,那就是它无法正确应用自己。在环顾四周后,我偶然发现了this question,它给了我等待所需的代码。所以我最终做的是添加那段代码以及 pgrep -x 命令,以便它可以抓取并等待正确的 pid。

所以最后,重要的部分代码最终看起来像这样:

if [ "$GAMENAME" = "BTR2" ] || [ "$GAMENAME" = "Runner 2" ]; then
    APPID=218060
    GameProc=[r]unner2
fi

sudo --validate
sudo xboxdrv --silent --quiet --detach-kernel-driver --mimic-xpad --dbus session & sleep 2
steam steam://rungameid/$APPID & sleep 20

check_run_and_grab(){
if ps aux | grep "$GameProc" > /dev/null
    then
        GamePID=$(pgrep -x "$GameProc")
        while kill -0 "$GamePID";do
            sleep 5
        done
        sudo killall xboxdrv
        exit 0
    else
        echo "Game process not found, waiting 5 seconds and trying again"
        sleep 5
        check_run_and_grab
fi
}

check_run_and_grab

对我来说,唯一能让它变得更好的是它不关心游戏参数的大写(第一个if 声明)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多