2017-09-29 4 views
6

Je script shell avec inotifwait mis en place comme sous:inotifywait événement déclencheur deux fois lors de la conversion docx au format PDF

inotifywait -r -e close_write,moved_to -m "<path>/upload" --format '%f##@@##%e##@@##%w' 

Il y a quelques fichiers docx résidant dans le répertoire surveillé et un script convertit docx au format PDF via ci-dessous commande:

soffice --headless --convert-to pdf:writer_pdf_Export <path>/upload/somedoc.docx --outdir <path>/upload/ 

L'événement est déclenché deux fois dès que le PDF est généré. Les entrées sont les suivantes:

somedoc.pdf##@@##CLOSE_WRITE,CLOSE##@@##<path>/upload/ 
somedoc.pdf##@@##CLOSE_WRITE,CLOSE##@@##<path>/upload/ 

Qu'est-ce qui ne va pas ici?

Cordialement

+0

J'ai jeté un coup d'oeil sur le résultat de strace, à la fois 'close' de soffice.bin lui-même, le premier est de copier le fichier de résultat pdf temporaire à la destination, la seconde est de vérifier ses statistiques. mais pourquoi cela vous dérange? – georgexsh

+0

Merci @georgexsh pour votre réponse. En fait, il existe une fonctionnalité COPY-TO-CLOUD qui se lie à ce déclencheur. Ainsi, les fichiers sont copiés deux fois par gettign et certains autres travaux de maintenance sont effectués en parallèle. –

+0

@JatinDhoot Quel type de réponse cherchez-vous? – ffeast

Répondre

1

Il est déclenché deux fois parce que c'est comment soffice semble se comporter en interne. Un jour il peut commencer à l'écrire 10 fois et faire sleep 2 entre de telles écritures pendant une seule exécution, notre programme ne peut pas et je crois ne devrait pas anticiper et en dépendre.

Je vais essayer de résoudre le problème sous un angle différent - permet de mettre tout le fichier converti dans un répertoire temporaire et déplacez-le vers le répertoire cible, comme ceci:

soffice --headless --convert-to pdf:writer_pdf_Export <path>/upload/somedoc.docx --outdir <path>/tempdir/ && mv <path>/tempdir/somedoc.pdf <path>/upload/

et l'utilisation inotifywait de la manière suivante:

inotifywait -r -e moved_to -m "<path>/upload" --format '%f##@@##%e##@@##%w' 

l'avantage est que vous ne dépendez plus sur la logique interne de soffice. Si vous ne pouvez pas ajuster le comportement du script produisant les fichiers pdf alors en effet vous devrez recourir à une solution de contournement comme @Tarun suggéré.

+0

Merci, cela a fonctionné. Bounty récompensé avec respect. –

1

Je ne pense pas que vous pouvez contrôler le programme externe en tant que tel. Mais je suppose que vous utilisez cette sortie pour un tuyau et que vous l'insérez ailleurs. Dans ce cas, vous pouvez éviter un événement qui se produit en continu avec une durée de quelques secondes

Nous ajoutons %T---format et --timefmt "%s" pour obtenir le temps d'époque. Ci-dessous la commande mise à jour

$ inotifywait -r -e close_write,moved_to --timefmt "%s" -m "/home/vagrant" --format '%f##@@##%e##@@##%w##T%T' -q | ./process.sh 
test.txt##@@##CLOSE_WRITE,CLOSE##@@##/home/vagrant/ 
Skipping this event as it happend within 2 seconds. TimeDiff=2 
test.txt##@@##CLOSE_WRITE,CLOSE##@@##/home/vagrant/ 

Cela a été fait en utilisant touch test.txt, temps multiples à chaque seconde. Et comme vous pouvez voir la deuxième a même été sauté. Le process.sh est un simple script bash

#!/bin/bash 

LAST_EVENT= 
LAST_EVENT_TIME=0 
while read line 
do 
    DEL="##T" 
    EVENT_TIME=$(echo "$line" | awk -v delimeter="$DEL" '{split($0,a,delimeter)} END{print a[2]}') 
    EVENT=$(echo "$line" | awk -v delimeter="$DEL" '{split($0,a,delimeter)} END{print a[1]}') 
    TIME_DIFF=$(($EVENT_TIME - $LAST_EVENT_TIME)) 
    if [[ "$EVENT" == "$LAST_EVENT" ]]; then 
    if [[ $TIME_DIFF -gt 2 ]]; then 
     echo "$EVENT" 
    else 
     echo "Skipping this event as it happend within 2 seconds. TimeDiff=$TIME_DIFF" 
    fi 
    else 
    echo $EVENT 
    LAST_EVENT_TIME=$EVENT_TIME 
    fi 
    LAST_EVENT=$EVENT 
done < "${1:-/dev/stdin}" 

Dans votre script réel que vous désactivez le echo si, celui-ci était juste pour la démo fin

+0

Merci Tarun pour vos efforts. Je vais essayer et vous le faire savoir. Cordialement –