Comment, dans un script, puis-je déterminer si un fichier est en cours d'écriture dans un autre processus?

21

Je suis très nouveau dans les scripts bash, donc je peux aboyer dans le mauvais arbre, mais voici ma situation actuelle:

Dans un script, je démarre soffice ; convertir un odt en pdf

Il semble que le soffice se détache du processus du script et s'éloigne pour faire sa propre chose. D'accord, c'est bien; Les applications GUI ont tendance à le faire ...

Cependant, je dois attendre que le nouveau pdf soit entièrement écrit, car ma prochaine étape consiste à traiter ce nouveau pdf .

(Pour autant que je sache), je ne peux pas utiliser l'ID de processus de soffice, car il peut avoir déjà été un processus en cours avant le démarrage de mon script: par exemple. le bureau peut être déjà ouvert pour une activité GUI normale pour un autre document / présentation / feuille de calcul sans rapport.

Le nœud du problème pour moi est qu'avant de pouvoir continuer, la rédaction du nouveau pdf doit être finalisée ...

Existe-t-il un moyen de déterminer quand un fichier n'est plus ouvert à un autre processus en mode "écriture"? ...

Peter.O
la source

Réponses:

25

Vous pouvez utiliser lsof | grep /absolute/path/to/file.txtpour voir si un fichier est ouvert. Si le fichier est ouvert, cette commande renverra le statut 0, sinon elle renverra 256 (1).

Sachez que cette commande prendra une seconde car il y a normalement beaucoup de fichiers ouverts à tout moment.

Vous pouvez également utiliser lsof -c gedit, par exemple, pour voir quel fichier gedit a ouvert. Restreindre la sortie à un seul processus réduira le temps d'exécution à pratiquement rien.

Voici un script à attendre:

#!/bin/bash

while :
do
    if ! [[ `lsof -c python3.2 | grep test.py` ]]
    then
        break
    fi
    sleep 0.5
done
echo "done"

Cela s'exécute pendant qu'un processus 'pyhton3.2' a ouvert le fichier 'test.py'. Dès que le fichier est fermé, il passe à «écho terminé» et se ferme.

J'ai mis 'sleep 0.5' dedans pour que la boucle ne monopolise pas trop le CPU. Sinon, il utilisera 100% de CPU.

Bonus Il semble y avoir un moyen simple de créer un odt en pdf:

Merci à scls19fr sur le forum OOo pour cette belle astuce. Vous pouvez convertir des fichiers OpenOffice Writer en PDF à partir de la ligne de commande en utilisant unoconv -f pdf input.odtPour obtenir unoconv, exécutez simplement sudo apt-get install unoconvsur le terminal. (rhyshale de rhyshale.wordpress.com)

Stefano Palazzo
la source
Enveloppez cela dans une boucle jusqu'à et vous avez un accord.
Nick Pascucci
C'est fait. :-) J'espère que ce n'est pas un style terrible - je n'ai pas pris la peine de lire sur les meilleures pratiques. Cela fonctionne bien quand même.
Stefano Palazzo
Merci Stefano ... oui, ça marche ... c'est donc une bonne et correcte réponse .. Une note latérale, elle a mis en évidence que ce qui se passe dans soffice n'est pas comme je le pensais .. Il semble qu'un fichier temporaire est en cours de création et le fichier final est (peut-être / probablement) renommé à la fin ... Donc, je regarde maintenant ... dans ce cas, je devrai peut-être juste attendre son * existence ... ... et merci pour le lien sur unoconv .. je vais l'examiner .. (dans l'ensemble, je convertis .pdf en plusieurs ..jpegs un par page)
Peter.O
@ fred.bear d'attendre jusqu'à ce qu'un fichier existe, remplacer le instruction if avec ceci: if [ -f test.odf ]. (le script bash peut être tellement énigmatique parfois ...)
Stefano Palazzo
6
essayez lsof -- /path/to/fileplutôt d'éviter le grep'ing
RubyTuesdayDONO