我使用Python通过简单地使用Python的“os”库来执行外部程序:
os.system("./script1") # script1 generates several log files and the most important for me is "info.log" !
os.system("./script2") # script2 uses the output from script1
问题是这些脚本是50000元素“for循环”,“script1”需要至少2分钟来完成它的工作(它有固定的持续时间) 在前1-2秒,我可以通过查看“info.log”文件找出是否需要输出数据。但是,由于“script1”是一个已经编译好的程序,我无法修改它,所以我必须等到它完成。
我在想Bash中的一个方法,允许我同时运行两个进程:
一个是启动./script1
,另一个是监视“info.log”文件中的任何更改...
如果“info.log”的大小已更新或更改,则第二个脚本应终止这两个进程。
类似的东西:
os.system("./mercury6 1 > ./energy.log 2>/dev/null & sleep 2 & if [ $(stat -c %s ./info.log) -ge 1371]; then kill %1; else echo 'OK'; fi")
- 这不起作用......
如果有人知道方法,请告诉我!
答案 0 :(得分:0)
import os
import time
os.system("script1")
while True: # Now this would run in 10 sec cycles and checks the output of the logs
try: # And you don't have the wait the whole 2 mins to script1 to be ready
o = open("info.log", "r") # or add os.system("script2") here
# Add here more logs
break
except:
print "waiting script1 to be ready.."
time.sleep(10) # Modify (seconds) to be sufficient to script1 to be ready
continue
答案 1 :(得分:0)
我建议使用subprocess
,其中this answer的组合描述了如何杀死bash脚本以及一些监控文件的方法,例如watchdog或简单的轮询循环。
答案 2 :(得分:0)
你可以尝试这个。告诉我script1是否在运行时暂停,以便我们可以尝试进一步配置它。
#!/bin/bash
[ -n "$BASH_VERSION" ] || {
echo "You need Bash to run this script."
exit 1
}
set +o monitor ## Disable job control.
INFO_LOG='./info.log'
if [[ ! -f $INFO_LOG ]]; then
# We must create the file.
: > "$INFO_LOG" || {
echo "Unable to create $INFO_LOG."
exit 1
}
fi
read FIRSTTIMESTAMP < <(stat -c '%s' "$INFO_LOG") && [[ $FIRSTTIMESTAMP == +([[:digit:]]) ]] || {
echo "Unable to get stat of $INFO_LOG."
exit 1
}
# Run the first process with the script.
./script1 &
SCRIPT1_PID=$!
disown "$SCRIPT1_PID"
# Run the second process.
(
function kill_processes {
echo "Killing both processes."
kill "$SCRIPT1_PID"
exit 1
}
[[ -f $INFO_LOG ]] || {
echo "File has been deleted."
kill_processes
}
read NEWTIMESTAMP < <(stat -c '%s' "$INFO_LOG") && [[ $NEWTIMESTAMP == +([[:digit:]]) ]] || {
echo "Unable to get new timestamp of $INFO_LOG."
kill_processes
}
[[ NEWTIMESTAMP -ne FIRSTTIMESTAMP ]] || {
echo "$INFO_LOG has changed."
kill_processes
}
sleep 4s
) &
disown "$!"
您可能还想在此处查看其他类似解决方案:linux script with netcat stops working after x hours
(
function kill_processes {
echo "Killing both processes."
kill "$mercury6_PID"
exit 1
}
while IFS= read -r LINE; do
[[ "${LINE}" == "ejected" ]] && { ## Perhaps it should be == *ejected* ?
echo "$INFO_LOG has changed."
kill_processes
}
done < <(tail -f "$INFO_LOG")
) &
disown "$!"
答案 3 :(得分:0)
已经完成了!不那么优雅,但它的作品!这是代码:
#!/斌/庆典
[-n“$ BASH_VERSION”] || { echo“你需要Bash来运行这个脚本。” 退出1 }
#setset + o monitor ##禁用作业控制。
INFO_LOG = “./ info.out”
#使用脚本运行第一个进程。
./ mercury6 1&gt; ./energy.log 2&gt; / dev / null&amp; mercury6_PID = $! 否认“$ mercury6_PID”
#运行第二个过程。
(
睡觉5
function kill_processes {
回声“杀死两个进程”。
杀死“$ mercury6_PID”
退出1
}
而IFS =读-r LINE;做
[[“$ {LINE}”== “弹出”]] || [[“$ {LINE}”== “完成。”]]&amp;&amp; {
echo“$ INFO_LOG已发生变化。”
killall尾巴
KILL_PROCESSES
}
完成&lt; &lt;(tail -f“$ INFO_LOG”)
)
#&安培;
#disown“$!”
如果您有任何建议,欢迎您!顺便说一下,我也会尝试在python中使用os.fork()。 再次感谢!
答案 4 :(得分:-1)
请参阅here(Google是您的朋友)。您可以使用&amp ;;进行流程后台任务。签名,然后使用wait
让父进程等待其子进程。