6 votes

Pourquoi mon bash script se fait-il "tuer" ? Comment puis-je empêcher cela ?

J'ai écrit un bash script pour tester les programmes C écrits par des étudiants contre une suite de tests. Pour une raison quelconque, le script se fait tuer après un certain temps. Je suis un novice en matière de script bash et jusqu'à présent je n'ai pas trouvé la raison. Voici le script.

#!/bin/bash
ulimit -t 1
tests_dir=tests
run_dir=tests
find . -name "*.c" | while read cfile; do rm a.out &> /dev/null; gcc "$cfile" -lm -w &> /dev/null;
if [ ! -f a.out ]; 
then 
    echo "$cfile did-not-compile" >> "$run_dir/results.out";
else
    find "$tests_dir" -name "in*.txt" | while read testin; do echo "running $testin on $cfile"; 
    rm test.out &> /dev/null; 
    rm space_less_testout &> /dev/null;
    LD_PRELOAD=../../EasySandbox/EasySandbox.so ./a.out < $testin | grep -v "entering SECCOMP mode" &> test.out;
    if [ -e test.out ]; then
            testout=${testin/in/out}
            tr -d '\n' < $testout | tr -d ' ' > space_less_testout
            echo -e '\n' >> space_less_testout

            if diff -qwB "$testout" test.out &> /dev/null
            then
                    # if no difference then takes true brance (based on return value)
                    echo "$cfile ;passed-on-test; $testin" >> "$run_dir/results.out"; echo "passed-on-test $testin";
            elif diff -qB space_less_testout test.out &> /dev/null 
            then
                    # or no difference with new-line removed should-be-output (just a formatting error)
                    echo "$cfile ;passed-on-test; $testin" >> "$run_dir/results.out"; echo "passed-on-test $testin";
            else
                    echo "$cfile ;failed-on-test; $testin" >> "$run_dir/results.out"; echo "failed-on-test $testin";
            fi
    fi
done;
fi
done;

15voto

Fabiano Soriani Points 543

ulimit -t 1 limite le temps CPU du script à 1 seconde. Lorsque le script a consommé tout son temps CPU, il est tué.

Pour limiter le temps CPU d'une seule commande dans votre script, vous pouvez utiliser les parenthèses pour la lancer dans un sous-shell avec sa propre limite, par ex.

(ulimit -t 1; LD_PRELOAD=../../EasySandbox/EasySandbox.so ./a.out < $testin)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X