运行两个脚本并在另一个完成时终止一个脚本

时间:2018-12-06 15:44:12

标签: bash shell

我有两个脚本,一个python和一个c ++。我需要python脚本仅在c ++脚本在后台处于活动状态时运行,然后同时终止。我必须这样做,因为python脚本包含一个依赖C ++代码输出的无限循环。我是一个完全的新手,所以我从在这里找到的答案中编写了这个bash脚本:

./test &
pid=$!

trap "kill -0 $pid 2> /dev/null" EXIT

while kill -0 $pid 2> /dev/null; do
        python display.py
done

trap - EXIT

,但是它实际上无法终止python脚本,并且一直循环播放,直到我手动终止该进程为止。如果有用,我正在使用ubuntu 18.04.1。

2 个答案:

答案 0 :(得分:1)

问题是这部分:

while kill -0 $pid 2> /dev/null; do
    python display.py
done

一旦python display.py启动,脚本将停止并等待其完成。这意味着它不再执行kill -0命令。如果其他进程启动,则可以启动display.py命令,然后在C程序完成时将其终止。

./test &
pid=$!

if kill -0 $pid 2>/dev/null; then
  #c program started
  python display.py &
  python_pid=$!

  while kill -0 $pid 2>/dev/null; do
    #c program running
    sleep 1;
  done
  #c program finished
  kill $python_pid
fi

话虽如此,我同意@Poshi。更好的方法是使用管道。由于python程序正在从c程序读取,因此您应该执行类似./test.sh | python display.py的操作。上面的答案更多是“如何破解您已经尝试过的方法”。

答案 1 :(得分:0)

与其他shell一样,Bash具有内置的wait命令来等待后台命令退出。除非您的顶层程序在其他程序运行时需要做其他事情,否则您可以简单地在后台运行它们,等待第一个程序完成,然后杀死第二个程序:

#! /bin/bash

./test &
testpid=$!

python display.py &
pythonpid=$!

wait "$testpid"

printf "Killing 'display.py' (PID %d)\\n" "$pythonpid" >&2
kill "$pythonpid"

如果可以在C ++程序之前运行Python程序,那么一个更简单的选择是:

#! /bin/bash

python display.py &
pythonpid=$!

./test

printf "Killing 'display.py' (PID %d)\\n" "$pythonpid" >&2
kill "$pythonpid"