0

毎日特定の時間にスクリプトを実行するcronjobがあります。このスクリプトは、特定のフォルダーにある大きなファイル(約2GB)を変換するためのものです。問題は、私の同僚がcronjobとして記述されたファイルを時間の前にフォルダーに置いたわけではないということです。

スクリプトにコマンドを追加したり、次の2番目のスクリプトを記述したりするのを手伝ってください。

  1. ファイルがフォルダに存在するかどうかを確認してください。
  2. 前のアクションが当てはまる場合は、ファイルサイズを毎分確認してください。(まだ入ってくる大きなファイルの変換は避けたいです)。
  3. ファイルサイズが2分間変わらない場合は、変換用のスクリプトを開始します。

これまでのスクリプトの重要な行を紹介します。

cd /path-to-folder
for $i in *.mpg; do avconv -i "$i" "out-$i.mp4" ; done

ヘルプのための10倍!

コメント後の新しいコード:

フォルダにファイルがあります!

#! /bin/bash


cdate=$(date +%Y%m%d)
dump="/path/folder1"
base=$(ls "$dump")

if [ -n "$file"]
then
    file="$dump/$base"
    size=$(stat -c '%s' "$file")
    count=0
    while sleep 10
    do
        size0=$(stat -c '%s' "$file")
        if [ $size=$size0 ]
        then $((count++))
             count=0
        fi
        if [ $count = 2 ]
        then break
        fi
    done
    # file has been stable for two minutes. Start conversion.

CONVERSION CODE

fi

ターミナルのメッセージ:たぶんエラー???

script.sh: 17: script.sh: arithmetic expression: expecting primary: "count++"
4

2 に答える 2

3
file=/work/daily/dump/name_of_dump_file

if [ -f "$file" ]
then
    # size=$(ls -l "$file" | awk '{print $5}')
    size=$(stat -c '%s' "$file")
    count=0
    while sleep 60
    do
        size0=$(stat -c '%s' "$file")
        if [ $size = $size0 ]
        then : $((count++))
        else size=$size0
             count=0
        fi
        if [ $count = 2 ]
        then break
        fi
    done
    # File has been stable for 2 minutes — start conversion
fi

要件がわずかに改訂され(コメントで説明)、ファイル名にスペースや改行、またはその他の同様に扱いにくい文字が含まれていないと仮定すると、次のように使用できます。

dump="/work/daily/dump"                 # folder 1
base=$(ls "$dump")

if [ -n "$file" ]
then
    file="$dump/$base"
    ...code as before...
    # File has been stable for 2 minutes - start conversion
    dir2="/work/daily/conversion"       # folder 2
    file2="$dir2/$(basename $base .mpg).xyz"
    convert -i "$file" -o "$file2"
    mv "$file" "/work/daily/originals"  # folder 3
    ncftpput other.coast.example.com /work/daily/input "$file2"
    mv "$file2" "/work/daily/converted" # folder 4
fi

フォルダに何もない場合、プロセスは終了します。変換するファイルができるまで待機する場合は、ファイルテストをループする必要があります。

while file=$(ls "$dump")
      [ -z "$file" ]
do sleep 60
done

これは、シェルループのあまり知られていない機能を使用します。コントロールにコマンドをスタックすることはできますが、ループを制御するのは最後のコマンドの終了ステータスです。

于 2012-10-30T20:18:33.367 に答える
0

さて、私は最終的に次のようにいくつかの実用的なコードを作成しました:

#!/bin/bash

cdate=$(date +%Y%m%d)
folder1="/path-to-folder1"

cd $folder1

while file=$(ls "$folder1")
      [ -z "$file" ]
do sleep 5 && echo "There in no file in the folder at $cdate."
done

echo "There is a file in folder at $cdate"
size1=$(stat -c '%s' "$file")
echo "The size1 is $size1 at $cdate"
size2=$(stat -c '%s' "$file")
echo "The size2 is $size2 at $cdate"
if [ $size1 = $size2 ]
then
echo "file is stable at $cdate. Do conversion."

次の行は同じスクリプトをループするのに正しい行ですか?

else sh /home/user/bin/exist-stable.sh
fi

以下のコメントの後の正しいコードは

else exec /home/user/bin/exist-stable.sh
fi
于 2012-11-11T07:47:32.290 に答える