首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以子进程1的身份运行连续脚本,直到子进程2中的循环结束

以子进程1的身份运行连续脚本,直到子进程2中的循环结束
EN

Stack Overflow用户
提问于 2019-08-29 23:32:33
回答 1查看 78关注 0票数 1

我正在尝试编写一段Python代码作为一个子进程,它将在Linux shell中执行一个连续的命令,直到子进程2中的一个循环结束。

这是我正在尝试运行的连续命令:

代码语言:javascript
运行
复制
"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"

我希望它一直运行,直到在另一个子进程下完成其他操作:

代码语言:javascript
运行
复制
"for cycle in range(10)"

.

.

.

我不确定我到底在寻找什么,因为我不知道如何恰当地提出一个问题。

EN

回答 1

Stack Overflow用户

发布于 2019-08-30 16:22:17

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

传统上,这类事情是通过"pid文件“来完成的,就像这样……

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

代码语言:javascript
运行
复制
# Write our pid to disk so other processes know which pid to kill
echo $$ > /tmp/stress.pid

然后,在另一个过程中:

代码语言:javascript
运行
复制
# Kill our friend
xargs -a /tmp/stress.pid kill

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

代码语言:javascript
运行
复制
#!/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

示例输出

代码语言:javascript
运行
复制
[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的过程中,将测试放入循环中,以查看文件是否存在,如果存在,则中断或退出:

代码语言:javascript
运行
复制
while : ; do
    [ -f /tmp/STOP ] && break
    dd if= of= ...
done

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

代码语言:javascript
运行
复制
touch /tmp/STOP

很难看,但很有效。

当然,你可以把它修饰一下:

  • 在开始之前删除标记,以防存在以前的运行
  • 将标记的名称作为参数传递给每个脚本,以便您可以一次执行多项操作,每项操作都使用不同的标记文件
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57713491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档