0

Python の「os」ライブラリを使用するだけで、Python を使用して外部プログラムを実行しています。

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」は既にコンパイル済みのプログラムであり、変更できないため、終了するまで待つ必要があります。

2 つのプロセスを同時に実行できるようにする Bash の方法について考えていまし た./script1
サイズが更新または変更された場合、2 番目のスクリプトは両方のプロセスを終了する必要があります。

何かのようなもの:

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")

– これは機能しません...

どなたか方法をご存知でしたら教えてください!

4

5 に答える 5

0

できました!それほどエレガントではありませんが、うまくいきます!これはコードです:

#!/ビン/バッシュ

[ -n "$BASH_VERSION" ] || { echo "このスクリプトを実行するには Bash が必要です。" 出口 1 }

# set +o monitor ## ジョブ制御を無効にします。

INFO_LOG="./info.out"

# スクリプトで最初のプロセスを実行します。

./mercury6 1 > ./energy.log 2>/dev/null &mercury6_PID=$! 「$mercury6_PID」の所有権を剥奪する

# 2 番目のプロセスを実行します。

( sleep 5 function kill_processes { echo "Killing both processes." kill "$mercury6_PID" exit 1 } while IFS= read -r LINE; do
[[ "${LINE}" == "ejected" ]] || [[ " ${LINE}" == "完了しました。" ]] && { echo "$INFO_LOG が変更されました。" killall tail kill_processes } done < <(tail -f "$INFO_LOG") )

#&

#「$!」を捨てる

おすすめがあれば大歓迎です!ところで、Pythonでも os.fork() で作成しようとします。再度、感謝します!

于 2013-08-14T21:53:54.717 に答える
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 "$!"

ここで他の同様の解決策を確認することもできます: netcat を使用した linux スクリプトが x 時間後に動作を停止する


(
    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 "$!"
于 2013-08-14T09:40:38.243 に答える
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
于 2013-08-14T08:55:04.850 に答える