web-dev-qa-db-ja.com

非ブロッキング方法でinotifywaitを使用して結果をメールで送信する方法は?

スクリプトを何度かテストしてみましたが、成功しませんでした。これはスクリプトです:

zenity --question --text "my text"
if [ $? -eq 1 ]; then
    zenity --warning --text "my text"
else
    ping -n -c1 192.168.180.112
    # print result (0 se existir)
    echo $?
    if [ $? -eq 0 ]; then
        scp -r ~/Documents/Processo/CONCLUIDO/* [email protected]:/home/posto-ensaios/Documents/Processo
        fileName=$(inotifywait -e moved_from /home/posto-11v/Documents/Processo/CONCLUIDO | sed -r 's/^.*MOVED_FROM(,ISDIR)*\s+(.*)$/\2/g')
        mail -s "$fileName" [email protected] < ~/Documents/personaproject/Programa/scripts/mail.txt
        mv --backup ~/Documents/Processo/CONCLUIDO/* ~/Documents/personaproject/processos_terminados    
        zenity --info --text="my text"
    else
        zenity --warning --text "my text"
    fi
fi

sleepの後に「パイプ」を付けてsedコマンドを実行し、コマンドの順序を変更しようとしました。端末でスクリプトを実行すると問題はinotifyが常にアクションを待機し続けることです...

ファイルがコピー、移動され、$filenameがメールで送信されることを保証する必要があります...

何か助けは?
ありがとうございます。

1
DJames

監視対象のディレクトリからファイルが移動されるたびにメールを送信する場合は、別のプロセスを設定するこれを監視する必要がありますメールを送信します。

今説明した理由から、inotifywaitコマンドは同時に発生しないため、mvコマンドをどこに配置しても問題ありません、必要なイベントをキャッチしません。

ただし、別のプロセスからディレクトリを監視している場合は、監視中に移動が行われ、変更を検出できます。

前の例 に基づいて構築すると、次のサンプルスクリプトから始めることができます。

while true
do
    fileName=$(inotifywait -e moved_from /home/posto-11v/Documents/Processo/CONCLUIDO | sed -r 's/^.*MOVED_FROM(,ISDIR)*\s+(.*)$/\2/g')
    mail -s "$fileName" [email protected] < ~/Documents/personaproject/Programa/scripts/mail.txt
done

必要な詳細を入力してください。基本的には前の例と同じです。

注:
いくつかの注意点があります。たとえば、メールの送信中に一部の動作を見逃す可能性があります。移動の量と頻度によって異なります。

1
lgarzo

これが今どのように行われるかです(初期スクリプト):

zenity --question --text "my text"
if [ $? -eq 1 ]; then
    zenity --warning --text "my text"
else
    ping -n -c1 192.168.180.112
echo $?
if [ $? -eq 0 ]; then
    scp -r ~/Documents/Processo/CONCLUIDO/* [email protected]:/home/posto-ensaios/Documents/Processo
    Nohup ~/Documents/personaproject/Programa/scripts/mail.sh &
    sleep 1
    mv --backup ~/Documents/Processo/CONCLUIDO/* ~/Documents/personaproject/processos_terminados    
    zenity --info --text="my text"
else
    zenity --warning --text "my text"
fi
fi

次に、フォルダを監視してメールを個別に送信するための新しい「mail.sh」スクリプト:

while true
do
    fileName=$(inotifywait -e moved_from /home/posto-11v/Documents/Processo/CONCLUIDO | sed -r 's/^.*MOVED_FROM(,ISDIR)*\s+(.*)$/\2/g')
    mail -s "$fileName" [email protected] < ~/Documents/personaproject/Programa/scripts/mail.txt
done

あなたが言ったように、いくつかの注意点があります。複数のファイルがある場合、件名の最初のフォルダーで送信されるメールは1つだけです。これは改善すべき点です。これはユーザーが実行するスクリプトですが、約1週間に1回、おそらく1つのフォルダーのみで実行されます。

ありがとう!

1
DJames