我有两个脚本,一个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。
答案 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"