首页 > 解决方案 > 作为子进程 1 运行连续脚本,直到子进程 2 中的循环完成

问题描述

我正在尝试将 Python 代码编写为子进程,该子进程将在 Linux shell 中执行连续命令,直到子进程二中的循环完成。

这是我试图运行的连续命令:

"while (true); do dd if=/mnt/DATA/random.dat of=/dev/null bs=128K iflag=direct >> /mnt/DATA/random.dat; sleep 0.2; done > /dev/null 2>&1"

我希望它继续运行,直到在另一个子进程下完成其他事情:

"for cycle in range(10)"

.

.

.

我不确定我在寻找什么,因为我不知道如何正确地提出问题。

标签: pythonpython-3.xlinuxshellsubprocess

解决方案


本质上,您正在尝试在 2 个单独的进程之间进行通信;特别是当一个人希望另一个人退出时。

传统上,这种事情是通过“pid文件”完成的,就像这样......

让读取 MMC 的进程在启动时在文件中写入自己的“进程 ID” 。当另一个进程想要停止它时,它会读取该文件以获取进程 ID 并杀死它。

# Write our pid to disk so other processes know which pid to kill
echo $$ > /tmp/stress.pid

然后,在另一个过程中:

# Kill our friend
xargs -a /tmp/stress.pid kill

另一种选择可能是将压力测试和for循环放在同一个脚本中,如下所示:

#!/bin/bash

stressMMC(){
   while : ; do
      echo "[stress] Thrashing MMC..."
      # dd if=... of=... 
      sleep 1
   done
}

# Run stress function in background and save its process id
stressMMC &
stressPID=$!

# Mainline code
for ((i=0;i<10;i++)) ; do
   echo "[main] Looping..."
   if [ $i -eq 5 ] ; then
      echo "[main] Killing stressMMC"
      kill $stressPID > /dev/null 2>&1
   fi
   sleep 1
done

样本输出

[main] Looping...
[stress] Thrashing MMC...
[main] Looping...
[stress] Thrashing MMC...
[stress] Thrashing MMC...
[main] Looping...
[stress] Thrashing MMC...
[main] Looping...
[stress] Thrashing MMC...
[main] Looping...
[stress] Thrashing MMC...
[main] Looping...
[main] Killing stressMMC
./go: line 22: 37291 Terminated: 15          stressMMC
[main] Looping...
[main] Looping...
[main] Looping...
[main] Looping...

另一种选择是通过文件系统进行通信,所以这里有一个基于此的特别难看的解决方案!

在从MMC重复读取的过程中,在循环中放置一个测试,看是否有文件存在,如果存在则中断,否则退出:

while : ; do
    [ -f /tmp/STOP ] && break
    dd if= of= ...
done

在另一个过程中,当您想发出停止信号时,只需创建标记文件,使用:

touch /tmp/STOP

丑陋,但有效。

当然你也可以稍微打扮一下:

  • 在开始之前删除哨兵,以防之前的运行
  • 将哨兵的名称作为参数传递给每个脚本,这样您就可以一次做几件事,每件事都使用不同的哨兵文件

推荐阅读