監視と実行にはinotifywaitを使用しますが、キューでは

監視と実行にはinotifywaitを使用しますが、キューでは

~/rtorrent/completedダウンロードした急流コンテンツを。 Inotifywaitはバックグラウンドで表示される新しいファイルを確認し、そのファイル~/rtorrent/completedを使用してGoogleドライブにアップロードします。rclone copy

したがって、最初の急流が完了すると、ファイルを上のフォルダに移動してrcloneがアップロードを開始しますが、問題は、2番目の急流が完了してコンテンツを再度移動した~/rtorrent/completed後に最初のアップロードプロセスが中断されることです。 Inotifywaitはそれを新しいイベントとして扱います。とにかくキューに入れて一つずつできますか?

これは実行中のシェルスクリプトです。

#!/bin/bash

cd ~/rtorrent/readytoupload/
inotifywait -m ~/rtorrent/readytoupload -s ~/rtorrent/log.txt -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        rclone copy $file tempd:test/$file
    done

ベストアンサー1

私も数年前、職場で同様のプロセスを経験しました。 Linuxにファイルを許可するSamba共有があり、目標はビデオファイルをそこから別のディレクトリに移動してffmpegYouTubeにアップロードする前に処理することです。もう便利ではないので、スクリプトコードを投稿できません(仕事を変更しました)。しかし、いくつかのヒントを提供することができます。man mkfifo新しいファイルのパイプ()とそのためのヘルパースクリプトが必要です。パイプラインループからファイルを「読み込み」。

したがって、少なくとも2つのスクリプトが必要です。 1つはinotifywait新しいファイル名をパイプに送信するために実行し、もう1つはパイプを読み取り、必要なプロセスをトリガーします(あなたの場合はアップロードを使用rclone)。追加された新しいファイルはすべてパイプラインに配置され、ファイルを待ちます。最初のスクリプトは新しいファイルを継続的に監視し、できるだけ早く補助スクリプトに送信する必要があります。

つまり:

#!/bin/bash
cd ~/rtorrent/readytoupload/
inotifywait -m ~/rtorrent/readytoupload -s ~/rtorrent/log.txt -e create -e moved_to |
while read path action file; do
   echo "The file '$file' appeared in directory '$path' via '$action'"
   # I'm not entirely sure about the & placement here, if its neccesary at all,
   # but the goal is to prevent a block while the secondary script is working on another file.
   echo ${file} > /tmp/mypipe &
done

ヘルパースクリプトの例:

#!/bin/bash
while true ; do
    if read line < /tmp/mypipe ; then
        echo $line
        # your rclone command goes here.
    fi
loop

中カッコは、スペースを含むファイル名が複数の引数として解釈されるのを防ぐために存在します。このように引用する必要があります"${file}"

コンピュータの起動後にスクリプトを起動するには、操作を実行するための3番目のスクリプトが必要です。デーモンスクリプトをトリガーしたり、(or)で同様のスクリプトを実行したりすることをお勧めsu -cします。&rc.local/etc/rc.d/etc/init.d

おすすめ記事