私は次のスクリプトを書いた。 udevによって呼び出されます。外部USBハードドライブを接続すると、スクリプトはボリュームがtruecryptとしてマウントされていることを確認し、そうでない場合はマウントし、マウントされている場合はフォルダ内のすべてのファイルを外部ハードドライブにコピーします。コピーが完了したら、ボリュームがまだtruecryptによってマウントされていることを確認してください。そうであれば削除しようとし、そうでなければ私に電子メールを送ります。
私が実装したいのは、ボリュームがマウントされていることを再帰的に確認する方法です。つまり、ボリュームがまだマウントされている場合は、ボリュームがマウントされていないことを確認し、電子メールが送信されるまでマウント解除を試みる必要があります。
より明確に言えば、Windows cmdではGOTOタグを使用しますが、Linux bashにはGOTOはありません。
#!/bin/sh
#
############ Parameters ############
from="from"
dest="dest"
smtp="smtp"
username="username"
pass="pass"
message="Sync to hard disk 1TB completed. You shall now remove the external hard drive."
subject="Sync to hard disk 1TB completed."
file="/media/truecrypt2/sync/dummy.file"
sendanemail="sendEmail -f $from -t $dest -u $subject -s $smtp -xu $username -xp $pass -m $message"
############ End Parameters ############
sleep 4
touch $file
if [ -f $file ];
then
cp /storage/sdf1/folder/*.txt /media/truecrypt2/sync/ -n -r
cp /storage/sdf1/folder/*.jpg /media/truecrypt2/sync/ -n -r
else
echo "truecryptpassword" | truecrypt /dev/sdj1 /media/truecrypt2 -t -k="" --protect-hidden=no -p=""
cp /storage/sdf1/folder/*.txt /media/truecrypt2/sync/ -n -r
cp /storage/sdf1/folder/*.jpg /media/truecrypt2/sync/ -n -r
fi
sleep 4
if [ -f $file ]
then
truecrypt -d /dev/sdj1
if [ -f $file ]
then
truecrypt -d /dev/sdj1
else
$sendanemail
fi
else
$sendanemail
fi
答え1
while true; do
if [ -f $file ]; then
truecrypt -d /dev/sdj1
break
fi
$sendanemail
sleep n # change n to number of seconds to pause
done
ループは、ステートメントの実行が完了するwhile
まで永久に実行され続けます。 trueと評価するbreak
と、[ -f $file ]
対応するコードブロックが実行され、break
ループが終了します。それ以外の場合は$sendemail
実行され、sleep n
ループが再開されます。
答え2
while [[ -f $file ]]; do
truecrypt -d /dev/sdj1
sleep 10 # pause for 10 seconds
done
$sendanemail
あなたの$subject
メッセージが「完了」であることを考慮すると、あなたは電子メールだけを送信したいと仮定します。
このバージョンは、成功するまで繰り返しtruecryptドライブを取り外すことを試み、電子メールを送信します。
USBドライブをマウント解除できないと、無限ループが発生します。別のアプローチは、スクリプトにタイムアウトを追加することです。
attempts=5
while [[ -f $file ]]; do
truecrypt -d /dev/sdj1
sleep 10
attempts=$(($attempts - 1))
if [[ $attempts -eq 0 ]]; then
subject="Failed to unmount /dev/sdj1"
message="Cannot umount external hard disk. Please verify sync to hard disk 1TB completed and manually unmount the external hard disk before removal."
sendanemail="sendEmail -f $from -t $dest -u $subject -s $smtp -xu $username -xp $pass -m $message"
break
fi
# attempts=$(($attempts - 1)) # this adds an extra attempt
done
$sendanmail
答え3
まあ、必要な人のためにここに私の最終的なスクリプトがあります。魅力のように動作するようです。
#!/bin/sh
#
# Comments....
############ Parameters ############
attempts="3"
from="[email protected]"
to="[email protected]"
smtp="smtp.example.com:25"
username="[email protected]"
pass="emailpass"
message="Sync to hard disk 1TB completed. You shall now remove the external hard drive."
subject="SRVR: Sync to hard disk 1TB completed."
file="/media/truecrypt2/sync/dummy.file"
sendanemail="sendemail -f $from -t $to -u $subject -s $smtp -xu $username -xp $pass -m $message"
subjectfail="Unable to umount external hard disk."
messagefail="Unable to dismount external hard disk after $attempts attempts. Please check it."
sendanemailfail="sendemail -f $from -t $to -u $subjectfail -s $smtp -xu $username -xp $pass -m $messagefail"
############ End Parameters ############
sleep 4
touch $file
if [ -f $file ];
then
cp /storage/sdf1/folder/*.txt /media/truecrypt2/sync/ -n -r
cp /storage/sdf1/folder/*.jpg /media/truecrypt2/sync/ -n -r
else
echo "my truecrypt password" | truecrypt /dev/sdj1 /media/truecrypt2 -t -k="" --protect-hidden=no -p=""
cp /storage/sdf1/folder/*.txt /media/truecrypt2/sync/ -n -r
cp /storage/sdf1/folder/*.jpg /media/truecrypt2/sync/ -n -r
fi
sleep 0
while [ -f $file ]; do
truecrypt -d /dev/sdj1
sleep 5
attempts=$(($attempts - 1)) # decrement timeout counter.
if [ $attempts -eq 0 ]; then
$sendanemailfail
break
fi
[[ ! -f $file ]] && $sendanemail # only send email once when `truecrypt -d` succeeds.
done