Sur quels fichier ce programme travaille-t-il en ce moment ?

On s’est tous posé un jour cette question lorsqu’on voulait connaître comment une application fonctionnait ou pour débugger un problème.

Pour savoir sur quels fichier un programme travaille, il y a deux possibilités (si vous en connaissez d’autres, utilisez les commentaires) : utiliser lsof ou find. Le premier n’est malheureusement pas toujours disponible sur tous les unix et n’est pas installé par défaut dans toutes les distributions. En plus, il faut être root pour le lancer, généralement. Mais il donne de sacré bon résultats et permet même d’en savoir un peu plus sur le fonctionnement interne des applications. Je vous renvoie à la page de manuel de lsof pour plus de détails ou cette page pour une petite intro sur les différentes manières d’utiliser lsof. 

La seconde méthode avec find nécessite de connaître dans quel répertoire travaille l’application. Mais comment un outil aussi basique que « find » peut me dire sur quels fichier travaille une application ? Et bien on va utiliser la date de modification du fichier pour savoir si le fichier a été modifié très récemment, si c’est le cas, c’est qu’une application est en train d’écrire dedans (voilà pourquoi il faut connaître dans quel répertoire elle travaille). Bon, voilà pour la théorie (j’espère que c’était assez court🙂 ). Pour la pratique, il faut utiliser ces commandes-ci :

$ cd directory
$ touch x
$ sleep 1
$ find . -newer x

On obtiendra alors la liste des fichiers qui ont été modifiés dans la dernière seconde (si l’on veut augmenter le délai, il faut changer l’argument de la commande sleep). Vous pouvez bien évidemment cumuler ces différentes commandes avec des « && » ou des « ; », (wordpress m’empêche de poster du shell script correctement).

C’est très basique comme méthode, mais l’avantage est que l’on se passe de lsof et que cela peut donner des résultats satisfaisant dans de nombreux cas. Bien sûr, l’inconvénient majeur est que si plusieurs applications écrivent dans le même répertoire, on ne saura pas laquelle a écrit quoi…

7 Réponses to “Sur quels fichier ce programme travaille-t-il en ce moment ?”

  1. bsergean Says:

    Sinon la methode de bourrin c’est de lancer l’exe avec strace et de faire un pipe sur les appels open.

  2. boklm Says:

    « En plus, il faut être root pour le lancer, généralement »

    Il faut etre root pour voir tous les fichiers ouverts pas tous les processus, mais pour voir les fichiers des procesuss qui t’appartiennent, il me semble qu’il n’y a pas besoin d’etre root.

  3. Pascal Terjan Says:

    Alternative à lsof :

    [pterjan@plop code]$ ls -l /proc/$(pidof galeon)/fd | grep /
    lrwx—— 1 pterjan pterjan 64 2007-09-07 17:37 0 -> /dev/null
    lrwx—— 1 pterjan pterjan 64 2007-09-07 17:37 1 -> /dev/null
    lrwx—— 1 pterjan pterjan 64 2007-09-07 17:37 2 -> /dev/null
    lr-x—— 1 pterjan pterjan 64 2007-09-07 17:37 20 -> /usr/lib/firefox-2.0.0.6/chrome/classic.jar
    lr-x—— 1 pterjan pterjan 64 2007-09-07 17:37 21 -> /usr/lib/firefox-2.0.0.6/chrome/toolkit.jar
    lr-x—— 1 pterjan pterjan 64 2007-09-07 17:37 22 -> /usr/lib/firefox-2.0.0.6/chrome/en-US.jar
    lrwx—— 1 pterjan pterjan 64 2007-09-07 17:37 25 -> /home/pterjan/.galeon/mozilla/galeon/cert8.db
    lrwx—— 1 pterjan pterjan 64 2007-09-07 17:37 26 -> /home/pterjan/.galeon/mozilla/galeon/key3.db
    lrwx—— 1 pterjan pterjan 64 2007-09-07 17:37 27 -> /home/pterjan/.galeon/mozilla/galeon/Cache/_CACHE_MAP_
    lrwx—— 1 pterjan pterjan 64 2007-09-07 17:37 29 -> /home/pterjan/.galeon/mozilla/galeon/Cache/_CACHE_001_
    lrwx—— 1 pterjan pterjan 64 2007-09-07 17:37 30 -> /home/pterjan/.galeon/mozilla/galeon/Cache/_CACHE_002_
    lrwx—— 1 pterjan pterjan 64 2007-09-07 17:37 31 -> /home/pterjan/.galeon/mozilla/galeon/Cache/_CACHE_003_
    lr-x—— 1 pterjan pterjan 64 2007-09-07 17:37 35 -> /usr/share/libthai/thbrk.br
    lr-x—— 1 pterjan pterjan 64 2007-09-07 17:37 36 -> /usr/share/libthai/thbrk.tl
    lr-x—— 1 pterjan pterjan 64 2007-09-07 17:37 45 -> /inotify
    lr-x—— 1 pterjan pterjan 64 2007-09-07 17:37 53 -> /dev/snd/timer
    lrwx—— 1 pterjan pterjan 64 2007-09-07 17:37 55 -> /dev/snd/pcmC0D0p

  4. Raphael Hertzog Says:

    Et la méthode élégante c’est de consulter /proc//fd/. Exemple avec iceweasel:
    $ ls -l /proc/7099/fd
    […]
    lr-x—— 1 rhertzog rhertzog 64 2007-09-08 09:28 19 -> /usr/lib/iceweasel/extensions/langpack-fr@firefox.mozilla.org/chrome/fr.jar
    l-wx—— 1 rhertzog rhertzog 64 2007-09-08 09:28 2 -> pipe:[14505]
    lrwx—— 1 rhertzog rhertzog 64 2007-09-08 09:28 20 -> /home/rhertzog/.mozilla/firefox/dyhvcynk.default/search.sqlite
    […]

  5. Raphael Hertzog Says:

    Lire /proc/<pid>/fd/ dans ma première phrase.

  6. Michael Scherer Says:

    Ou d’utiliser strace -p sur un processus déja lancé. Ça marche aussi avec gdb, mais c’est moins pratique🙂

    Je suppose enfin que selinux ou rsbac doivent pouvoir generer ce genre de trace, via un systéme d’audit.

  7. yoho Says:

    @boklm : c’est vrai. Sous mandriva, lsof est situé sous /usr/sbin, ce qui m’a fait pensé qu’il fallait être root, mais tu as raison, ça marche aussi bien en tant que simple utilisateur.

    Tous les autres : merci pour vos autres méthodes !🙂


Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :