Écrire un shell bash script qui consomme une quantité constante de la RAM pour un utilisateur de temps définie
Je suis en train d'écrire un shell bash script qui consomme une grande quantité de mémoire vive sur un dispositif intégré pour un utilisateur de temps définie. Comment puis-je le faire sans l'aide de tableaux ?
- je ne suis pas versé dans bash-fu, mais... quoi de mal avec l'aide de matrices?
- Les tableaux ne sont pas pris en charge sur cette limited shell sur le périphérique intégré.
- Alors il n'est pas Bash.
- À moins qu'il signifie associés tableaux, qui sont "récent" dans bash. En tout cas, je ne vois pas comment ne pas à l'aide de tableaux est pertinente pour ce problème.
- Si vous avez de base des outils GNU, vous pouvez le faire
yes | tr \\n x | head -c $BYTES | grep n
parce que grep charges de l'entrée ligne par ligne dans la mémoire RAM. Parce que la ligne sera de $OCTETS de long, il vous permettra de charger $OCTETS en mémoire. Grep lui-même utilise comme 200KO, vous pourriez avoir besoin de soustraire que. Si vous avez également bash, vous pouvez ajouter du temps:cat <(yes | tr \\n x | head -c $((1024*1024*2))) <(sleep 4) | grep n
(pour 2 mo de RAM, car 1024*1024*2=2MB). Si vous avezpv
et souhaitez augmenter lentement RAM:yes | tr \\n x | head -c $BYTES | pv -L $BYTESPERSEC | grep n
- Votre solution ne fonctionne pas pour moi parce que
grep
se bloque lorsque les lignes qui sont "trop long"- peut-être un problème de configuration. Le suivant a fonctionné pour moi:{ yes | head -c "$bytes"; sleep "$seconds"; } | tail -c "$bytes" >/dev/null
. - Je pourrais sort cette
dd bs=250M if=/dev/zero of=/dev/null
à occuper 250 MO
InformationsquelleAutor abc | 2011-02-11
Vous devez vous connecter pour publier un commentaire.
Même si les Bash tableaux ne sont pas pris en charge, il peut toujours être possible de créer semblable au tableau de variables à l'aide de la
eval
de commande intégré dans le shell en particulier.L'exemple de script suivant est basé sur quelques scripts que j'ai fait lorsque l'aide BusyBox dans un Linux embarqué projet. BusyBox utilise le Almquist shell (aussi connu comme Une Coquille, de la cendre, et sh), qui ne prend pas en charge les tableaux.
Être prudent avec les citer lors de l'utilisation de
eval
!De sortie:
En fonction de votre scénario, un script semblable à la suivante peut suffire.
Dans mon bref essai, ce script consommé ~570M à ~575M de la mémoire physique* pour la période de temps spécifiée de 5 minutes.
* Surveillé à l'aide de haut et memprof programmes de tests distincts
Personnellement, je aller avec Nick réponse, car en C est va être beaucoup plus facile vraiment.
Mais... si vous voulez vraiment éviter d'écrire un super-simple C programme pour le faire, puis (si le système est en cours d'exécution de Linux avec le droit des trucs intégré), vous devriez être en mesure de le faire par le montage d'un tmpfs avec une limite de taille cependant de la quantité de mémoire que vous souhaitez utiliser, puis, crachant des données dans un fichier que tmpfs pour le remplir (par, par exemple, de la copie de données à partir d'une source infinie (par exemple,
/dev/zero
).Le programme C est vraiment plus facile même si, comme longtemps que vous pouvez compiler pour la plate-forme.
Si vous avez un
/dev/shm
appareil, vous pouvez écrire ce fichier s'y trouve, puisque c'est un tmpfs par défaut.Vous avez besoin de distinguer entre alloué et de travail de mémoire vive. Il est facile de manger de la mémoire dans bash:
mais à moins que le script bat à travers les données fréquemment, puis les pages de la mémoire sont de bons candidats pour être échangé.
@JohnBartholomew
Votre idée sur un tmpfs de montage est également pas trop difficile et vous pouvez être plus sûr que c'est en fait de consommer de la RAM, non? (voir Chris Dodd commentaire du Pseudo-réponse)
mount -t tmpfs none /new/path/for/temp -o size=32m
dd if=/dev/zero of=/new/path/for/temp/zero.txt bs=32m count=1
Probablement
dd
va se plaindre qu'il n'y a aucun espace disponible sur le périphérique. Aussi, je ne sais pas combien de RAM sera utilisé exactement, mais si vous parlez de MB que ce devrait être bon.Je suis venu avec cette. /dev est un tmpfs