gpt4 book ai didi

python - 作为子进程 1 运行连续脚本,直到子进程 2 中的循环完成

转载 作者:太空宇宙 更新时间:2023-11-04 11:46:07 25 4
gpt4 key购买 nike

我正在尝试编写一个 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

丑陋但有效。

当然你可以装扮一下:

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

关于python - 作为子进程 1 运行连续脚本,直到子进程 2 中的循环完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57713491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com