python - 作为子进程 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)"
.
.
.
我不确定我在寻找什么,因为我不知道如何正确地提出问题。
解决方案
本质上,您正在尝试在 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
丑陋,但有效。
当然你也可以稍微打扮一下:
- 在开始之前删除哨兵,以防之前的运行
- 将哨兵的名称作为参数传递给每个脚本,这样您就可以一次做几件事,每件事都使用不同的哨兵文件
推荐阅读
- laravel - 添加修订后自动更改状态
- python-3.x - 我想从文本输入中提取第三行
- java - 尝试构建 gradle 时出错 - androidx.appcompat:appcompat:28.+
- javascript - 如何从列表javascript中删除第一项?
- angular - 将响应对象的值分配给模型对象
- javascript - 当我们使用“redux-starter-kit”时,如何访问另一个减速器中的减速器状态?
- saml-2.0 - Shibboleth 3 Idp 使用 ws-fed
- android - 无法通过我的 Android 应用程序中的蓝牙热敏打印机打印阿拉伯字符串
- python - 如何处理熊猫中的复制粘贴表-重塑列向量
- spring - 从 JPA 存储库的另一个表中选择数据