J'ai un script qui dirigera sa sortie vers |tee scriptnameYYMMDD.txt
. Après chaque cycle de la boucle for dans laquelle la sortie est générée, je vais inverser le contenu du fichier avec tac scriptnameYYYYMMDD.txt > /var/www/html/logs/scriptname.txt
pour que la sortie du journal soit visible dans une fenêtre de navigateur avec les lignes les plus récentes en haut.
J'aurai plusieurs scripts faisant cela en parallèle. J'essaie de minimiser l'activité du disque, donc la sortie de |tee scriptnameYYYYMMDD.txt
vers un RAMdisk serait la meilleure. mktemp
crée un fichier dans le /tmp
dossier, mais qui ne semble pas être hors disque.
shell-script
files
filesystems
scripting
tmp
user208145
la source
la source
fstab
afin de monter untmpfs
sur/tmp
puis redémarrer la machine.tail
les fichiers (ou de les lancer via CGI sur demande ou quelque chose) plutôt que d'tac
ingérer le tout.TEMPPATH="/ramdisk"
LOGPATH="/var/www/html/log"
...echo <various calls to echo> | tee -a $TEMPPATH/moveKRT$(date '+%Y%m%d').txt
... à la fin de la boucle for,cp $TEMPPATH/moveKRT$(date '+%Y%m%d').txt $LOGPATH/moveKRT$(date '+%Y%m%d').txt
tac $TEMPPATH/moveKRT$(date '+%Y%m%d').txt > $LOGPATH/moveKRT.txt
je suis conscient de la possibilité minuscule que le changement de 23: 59: 59.999 à 00:00: 00 peut affecter certains fichiers, mais la chance est acceptable.Réponses:
Vous pouvez monter une
tmpfs
partition et y écrire le fichier:Cette partition est désormais limitée à 500 Mo. Si votre fichier temporaire grossit de 500 Mo une erreur se produit:
no space left on device
. Mais peu importe lorsque vous spécifiez une plus grande quantité d'espace que la RAM de votre système.tmpfs
utilise également l'espace d'échange, vous ne pouvez donc pas forcer un plantage du système, contrairement àramfs
.Vous pouvez maintenant écrire votre fichier dans
/mountpoint
:la source
size=[num]%
est également très bien - un tmpfs peut être limité à un pourcentage de mémoire disponible. C'est généralement plus facile de cette façon si les commandes ne sont pas toujours ciblées pour la même machine (réelle / virtuelle) . Aussi pratique est qu'un tmpfs ne laisse pas tomber le contenu w /-o remount,size=newsize
.mount
n'autorisant pas les utilisateurs non root à utiliser-t
ou-o
? Autrement dit, comment peut-on créer des scripts qui utilisenttmpfs
(ou de la RAM de toute autre manière) pour économiser sur les opérations sur disque, si un système de fichiers approprié n'existe pas déjà sur le système?Essayez ceci avec Ubuntu:
la source
/run/shm/
? Puis-je appliquer deschmod
modifications au fichier temporaire si nécessaire? J'ai remarqué que les bits de mode du dossier sont identiques au/tmp
dossier. Merci./run/shm
(lien symbolique vers/dev/shm
)mktemp
ont également une autorisation par défaut de-rw-------
(600) et vous pouvez le modifier si nécessaire avecsudo chmod
.La réponse suivante a été découverte en examinant les réponses précédentes et les informations de cette question ici et n'aurait pas été trouvée sans elles. Cudos à eux.
Sur mon système linuxmint (et je suppose que la plupart des systèmes basés sur Ubuntu et éventuellement sur Debian aussi) il y a un tmpfs appartenant à l'utilisateur monté automatiquement sur
/run/user/1000/
Utilisez
df -T
pour vérifier.Sous
/run/user/
il y a un répertoire pour chaque utilisateur normal du systèmeCes répertoires sont nommés d'après les identifiants de leurs utilisateurs respectifs. Nous pouvons obtenir l'ID utilisateur avec
id -u
voirman id
pour plus de détails sur cette commande.Nous pouvons ensuite utiliser la
mktemp
commande avec l'--tmpdir
option pour créer des fichiers et des répertoires temporaires dans ce système de fichiers temporaires, créant ainsi des fichiers temporaires dans la RAM.En suivant les conseils donnés ici, je crée d'abord un répertoire temporaire, puis je crée mes fichiers temporaires en cela:
pour créer un répertoire temporaire
/run/user/1000/bash.w42BYxbG/
puispour y créer un fichier temporaire.
Cela facilite le nettoyage de ces fichiers car tout ce que j'ai à faire est
rm -r $mydir
.Par défaut, tous ces fichiers sont détenus et lisibles uniquement par l'utilisateur qui les a créés.
la source
/run/user/1000
est disponible sur chaque linux qui utilise systemd, il est donc non seulement disponible sur les systèmes basés sur Debian, mais aussi sur la plupart des autres distributions linux. Sinon, / tmp doit être utilisé à la place. Vous pouvez simplifier vos commandes en utilisant la variable $ XDG_RUNTIME_DIR qui conserve déjà le répertoire correct pour chaque utilisateur. Pour plus d'informations, consultez par exemple cette réponse: unix.stackexchange.com/questions/162900/…Si je comprends bien, les objectifs sont les suivants : (1) ne stocke le fichier sur le disque inversé, pour être servi au navigateur (note: cela pourrait être tmpfs, etc, comme toutes les autres réponses déjà détail); mais, (2) évitez d'écrire le premier fichier tmp sur le disque, avec la sortie d'origine; et pourtant, (3) affiche toujours la sortie d'origine sur stdout.
Si c'est le cas, les éléments suivants pourraient répondre à vos besoins, en utilisant la substitution de processus bash (c'est-à-dire, essentiellement un canal nommé):
Notez que cela imprime en continu la sortie vers stdout et lorsque la commande se termine (lorsque votre boucle se termine), inverse cette sortie et l'écrit dans le fichier de sortie. Illustré via ce qui suit, qui imprime une ligne par seconde, et après la fin, le fichier
/tmp/foo.txt
contient les lignes inversées:la source