J'ai besoin de suivre le temps d'accès au dossier, et je veux savoir quelles modifications y sont apportées.
Comment puis-je déclencher ces événements ? Existe-t-il un moyen d'exécuter un fichier .sh spécifique lorsque le dossier est ouvert ?
J'ai besoin de suivre le temps d'accès au dossier, et je veux savoir quelles modifications y sont apportées.
Comment puis-je déclencher ces événements ? Existe-t-il un moyen d'exécuter un fichier .sh spécifique lorsque le dossier est ouvert ?
Je suppose que vous avez besoin de connaître l'heure d'ouverture du dossier, par exemple. nautilus et non le le temps qu'il faut pour accéder au dossier.
Vous pouvez obtenir la liste des fenêtres à partir de la commande wmctrl -l
et voyez si le nom du dossier apparaît dans la liste. La boucle à vérifier prendrait cependant au moins une fraction de seconde pour remarquer que le dossier est ouvert.
Vous auriez wmctrl
à installer :
sudo apt-get install wmctrl
Dans l'exemple ci-dessous, le script exécute une commande lors du premier accès à un dossier, puis se termine.
Comment l'utiliser :
access_time.py
"<command_to_run>"
par votre commande (entre guillemets)Exécutez-le soit avec la commande :
python3 </path/to/script> <foldername_without_path>
ou, si vous l'avez rendu exécutable :
</path/to/access_time.py> <foldername_without_path>
import subprocess import sys
command = "<command_to_run>"
foldername = sys.argv[1] while True: try: test = subprocess.check_output(["wmctrl", "-l"]).decode("utf-8") except subprocess.CalledProcessError: pass if foldername in test: subprocess.call(["/bin/bash", "-c", command]) break
Vous pouvez cependant le faire fonctionner "tout en un", de sorte que vous n'avez pas besoin d'un autre script. Le script ci-dessous crée un fichier dans votre répertoire $HOME avec l'heure d'accès à votre dossier.. :
#!/usr/bin/env python3
import subprocess
import sys
import os
import time
home = os.environ["HOME"]
foldername = sys.argv[1]
#--- the path your file is saved to (change if you want to, but use full paths)
path = home
#---
while True:
try:
test = subprocess.check_output(["wmctrl", "-l"]).decode("utf-8")
except subprocess.CalledProcessError:
pass
if foldername in test:
with open(path+"/time_data.txt", "a") as out:
out.write("the folder "+foldername+" was opened "+time.ctime()+"\n")
break
Placez un point devant le nom du fichier pour en faire un fichier caché (appuyez sur Ctrl + H pour activer la visibilité) :
Si tu veux ça, change :
with open(path+"/time_data.txt", "a") as out:
dans :
with open(path+"/.time_data.txt", "a") as out:
(Attention à l'alinéa !)
D'après vos commentaires et la discussion en ligne, je comprends que vous recherchez en fait un outil permettant d'enregistrer l'accès à un dossier (par exemple, par nautilus) et les modifications apportées à son contenu.
En option supplémentaire, un journal complet script qui enregistre dans deux threads différents :
access_log.txt
access_log.txt
directory_log.txt
Ces événements sont enregistrés dans deux fichiers différents, car les journaux ont des temps de rafraîchissement différents. L'"enregistrement" en temps réel de ce qui se passe dans un grand répertoire avec beaucoup de sous-répertoires n'est pas quelque chose que l'on souhaite faire toutes les 5 secondes environ. La conséquence en est que :
le site répertoire Le journal (ajout/suppression de fichiers) a une précision de 10 minutes. Les événements seront signalés dans les 10 minutes suivant leur survenance, avec une précision de l'horodatage de 10 minutes.
Je l'ai testé sur un répertoire (réseau) de ~800 GB. Si votre répertoire est beaucoup plus petit, le répertoire Le cycle du journal peut également être (beaucoup) plus petit. Je l'ai testé par exemple sur un répertoire de 20 Go, avec un cycle de journalisation (du répertoire) de 10 secondes.
Exemple de sortie access_log.txt :
---------------Thu Feb 19 21:01:09 2015---------------
folder opened
---------------Thu Feb 19 21:01:27 2015---------------
folder closed
Exemple de sortie répertoire_log.txt :
---------------Thu Feb 19 21:14:24 2015---------------
+ /home/jacob/Afbeeldingen/Downloads/2023.pdf
- /home/jacob/Afbeeldingen/Downloads/History-journal
- /home/jacob/Afbeeldingen/Downloads/google-earth-stable_current_i386.deb
Configurez-le comme les scripts ci-dessus. avec une différence importante :
La commande pour l'exécuter est alors :
python3 /path/to/script.py
import subprocess import os import time import difflib from threading import Thread home = os.environ["HOME"]
folder = "/home/jacob/Afbeeldingen"
path = home
for f in os.listdir(path): if f.startswith("drcheck"): os.remove(path+"/"+f)
dr_data = path+"/directory_log.txt" access_data = path+"/access_log.txt"
for f in [dr_data, access_data]:
if not os.path.exists(f):
subprocess.Popen(["touch", f])
foldername = folder.split("/")[-1]
def check_windowlist(foldername): while True: try: if foldername in subprocess.check_output(["wmctrl", "-l"]).decode("utf-8"): return "folder opened\n" else: return "folder closed\n" break except subprocess.CalledProcessError: pass
def check_directory(directory, outfile): with open(outfile, "wt") as out: for root, dirs, files in os.walk(directory): for f in files: out.write(root+"/"+f+"\n")
def run_accesscheck(): while True: ch1 = check_windowlist(foldername) time.sleep(0.5) ch2 = check_windowlist(foldername) if ch1 != ch2: with open(access_data, "a") as out: out.write("-"15+time.ctime()+"-"15+"\n"+ch2+"\n")
def run_directorycheck():
last = 1; outfile_name = "drcheck"; last_outfile = ""
while True:
outfile = path+"/"+outfile_name+str(last)+".txt"
check_directory(folder, outfile)
if last != 1:
changes = []
diff = difflib.ndiff(
open(last_outfile).readlines(),
open(outfile).readlines()
)
for item in diff:
if item.startswith("-") or item.startswith("+"):
changes.append(item)
if len(changes) > 0:
with open(dr_data, "a") as out:
out.write("-"15+time.ctime()+"-"15+"\n")
for it in sorted(changes):
out.write(it)
out.write("\n")
os.remove(last_outfile)
last_outfile = outfile; last = last+1
time.sleep(600)
Thread(target = run_directorycheck).start() Thread(target = run_accesscheck).start()
Si vous voulez utiliser Bash au lieu de Python :
#!/bin/bash
folder=$1
while true;
do
command=$(wmctrl -l | grep -o "$folder")
if [[ "$folder" == "$command" ]];
then
./myscript.sh
break;
fi
done
Edit :
J'ai modifié un script pour que vous puissiez l'exécuter avec la commande suivante :
bash folderwatch.sh BackupSSD
Aussi, vous pouvez rendre un script exécutable afin de pouvoir l'utiliser sans sh ou bash, car le script est défini dans la première ligne du script, par exemple :
chmod u+x folderwatch.sh
./folderwatch.sh BackupSSD
sudo apt-get incron
pour installer le système "inotify cron".
http://inotify.aiken.cz/?section=incron&page=about&lang=en
echo $USER | sudo tee --append /etc/incron.allow
pour vous permettre de jouer le jeu.
icrontab -e
pour créer un événement à suivre. Il ouvre nano
.
Entrez le désir de votre cœur, par exemple,
/home/nodak/watched_dir IN_ACCESS /home/nodak/bin/personal.sh
Sauvegardez et testez.
Plus d'informations sur http://manpages.ubuntu.com/manpages/saucy/man5/incrontab.5.html
Bien qu'elle soit simple, et trompeuse, la syntaxe pour les manœuvres compliquées n'est pas tout à fait la même que celle de régulier bash, c.f., https://stackoverflow.com/questions/23706194/using-zenity-in-a-root-incron-job-to-display-message-to-currently-logged-in-user
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.