两个bash作业同时执行

时间:2013-08-14 08:18:04

标签: python bash

我使用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")

- 这不起作用......

如果有人知道方法,请告诉我!

5 个答案:

答案 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让父进程等待其子进程。