Je suis en train d'écrire un script de simulation dans bash. Il est censé exécuter un programme C qui donnera une sortie (que je redirige vers un fichier.) J'essaie (1) de faire un timeout après une certaine durée et aussi (2) de se terminer si le fichier de sortie atteint un certain fichier limite de taille. Je ne sais pas comment s'y prendre. De l'aide? Merci.Bash: Terminer à l'expiration du délai/dépassement de fichier lors de l'exécution de la commande
Répondre
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).
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.
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
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
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
@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. –