2016-04-09 5 views
1

Ich muss mehrere Aufrufe an ein C++ - Programm ausführen, das Frames aus einem Videospiel aufzeichnet. Ich habe ungefähr 1800 Testspiele, und einige von ihnen arbeiten und einige von ihnen nicht.Befehl nach einer bestimmten Zeit stoppen und das Ergebnis in Bash zurückgeben

Wenn sie nicht funktionieren, gibt die Konsole einen segmentation Fehler Fehler zurück, aber wenn sie funktionieren, öffnet das Programm ein Fenster und spielt das Spiel, und gleichzeitig zeichnet es jedes Bild auf.

Das Problem ist, dass, wenn es funktioniert, dieser Prozess nicht endet, bis Sie das Spielfenster schließen.

Ich muss ein Bash-Skript erstellen, das jedes Spiel testet, das ich habe und schreibe die Namen von denen, die in einer Textdatei funktionieren und die Namen derjenigen, die in einer anderen Datei nicht funktionieren.

Für den Moment, als ich mit dieser versucht haben, mit dem timeout Befehl:

count=0 
# Run for every file in the ROMS folder 
for filename in ../ROMs/*.bin; do 
    # Increase the counter 
    ((count++)) 
    # Run the command with a timeout to prevent it from being infinite 
    timeout 5 ./doc/examples/videoRecordingExample "$filename" 
    # Check if execution succeeds/fails and print in a text file 
    if [ $? == 0 ]; then 
     echo "Game $count named $filename" >> successGames.txt 
    else 
     echo "Game $count named $filename" >> failedGames.txt 
    fi 
done 

Aber es scheint nicht zu funktionieren, weil es alle Namen auf der gleichen Datei schreibt. Ich glaube, das liegt daran, dass die Bedingung innerhalb der if auf das Timeout und nicht auf die Ausführung des C++ - Programms selbst verweist.

Dann versuchte ich ohne die timeout und jedes Mal, wenn ein Spiel arbeitete, schloss ich manuell das Fenster, und dann war das Ergebnis das erwartete. Ich habe das mit nur 10 Spielen versucht, aber wenn ich es mit all den 1800 teste, müsste ich es komplett automatisch machen.

Also, gibt es eine Möglichkeit, diesen Prozess automatisch zu machen? Wie ein Befehl, um die Ausführung zu stoppen und gleichzeitig zu wissen, ob es erfolgreich war oder nicht?

+0

Vielleicht 'Timeout - Signal 9 - Preserve-Status ... usw.' würde besser funktionieren? – agc

Antwort

0

statt

timeout 5 ./doc/examples/videoRecordingExample "$filename" 

Sie könnte dies versuchen:

./doc/examples/videoRecordingExample "$filename" && sleep 5 && pkill videoRecordingExample 
+0

Ich habe das gerade jetzt versucht, und es ist ein bisschen komisch, denn jetzt muss ich das Spielfenster noch manuell schließen, aber dann wartet es 5 Sekunden, um das nächste Spiel auszuprobieren. –

0

tauschen die Argumente in der Timeout Code. Es sollte sein:

timeout 5 "$filename" ./doc/examples/videoRecordingExample 

Grund: die Syntax für Timeout ist:

Timeout [OPTION] DAUER COMMAND [ARG] ...

Der Befehl sollte also sein kurz nach der DAUER. In dem obigen Code würde die vermutlich nicht ausführbare Datei videoRecordingExample das COMMAND sein, das jedes Mal wahrscheinlich einen Fehler zurückgibt.

+0

Die Datei videoRecordingExample funktioniert ganz gut, es hat bei mir funktioniert, ich glaube nicht, dass das Problem wirklich ist ... Das Problem ist, dass ich das Fenster manuell schließen muss, wenn ich zum nächsten Spiel gehen will, und ich möchte, dass es automatisch ist. Außerdem ist "$ filename" der Eingabeparameter für das C++ - Programm. –

+0

@MartaSampietro, Sie sagen, * videoRecordingExample * ist eine ausführbare Datei C++ - Programm? Es ist in einem 'doc'-Unterordner, das ist also nicht offensichtlich. – agc

+0

Ja, es funktioniert, und es ist in den Unterordnern doc/examples yes. Entschuldigung, wenn ich es auf dem Post nicht gut erklärt habe, aber ja, das Programm funktioniert gut, das einzige Problem, das ich habe, ist, dass ich nicht weiß, wie man die Ausführung automatisch abbricht und seinen Status weiß, um zu wissen, was Spiele funktionieren für das C++ Programm und welche Spiele nicht. –

Verwandte Themen