2010-04-13 11 views

Répondre

3

Il existe une commande GNU coreutil timeout pour les délais d'attente.

Recherchez ulimit -f 32 pour définir la taille de fichier maximale (à 16 Ko, elle compte dans les blocs de 512 octets).

Objection:

ulimit est [pas] approprié parce que je dois créer d'autres fichiers. Je dois limiter seulement l'un d'entre eux. À moins que le programme doit créer un grand fichier et un petit fichier et vous devez limiter tout simplement le petit fichier, vous pouvez utiliser un sous-shell à bon escient::

(
ulimit -f 32 
timeout 10m -- command arg >file 
) 

La limite

contre La taille du fichier est limitée aux commandes du sous-shell (qui est marquée par la paire de parenthèses).

+0

Je ne pense pas qu'ulimit est approprié parce que je dois aussi créer d'autres fichiers. Je dois limiter seulement l'un d'entre eux. – Chris

+0

Cette solution fonctionne bien pour la condition de limite de fichier. Cependant, je ne peux pas utiliser les coreutils (les machines sur lesquelles il doit fonctionner ne les ont pas installées). Y at-il une autre option pour le timeout? – Chris

+0

@Chris, vous pouvez démarrer un autre script en arrière-plan qui dort nnn secondes, puis envoie un signal au PID parent, que le parent pourrait gérer avec 'trap'. Racey, mais ça devrait marcher. –

0

vous pouvez utiliser timeout commande par exemple

timeout -s 9 5s ./c_program > file 

pour vérifier la taille du fichier, vous pouvez stat le fichier, puis faites if/else

limit=1234 #bytes 
size=$(stat -c "%s" file) 
if [ "$size" -gt "$limit" ] ;then 
    exit 
fi 

voir aussi here si vous ne pouvez pas utiliser ces outils GNU ou here pour d'autres inspirations.

0

Cela commence yourcommand, la redirection via dd-youroutputfile et de mettre une limite de 10000000 octets sur elle: dd prendra fin et SIGPIPE sera envoyé à yourcommand

yourcommand | dd of=youroutputfile bs=1 count=10000000 & 

Cela va attendre 5 secondes et tuer votre commande s'il n'est pas déjà terminé:

sleep 5 
kill %yourcommand