
ファイルの削除に関する質問を再発行します。 2つのSCO Unixシステム間でファイルを転送するためのスクリプトがあります。シナリオは長年にわたり堅固に保たれてきました。最近、ある場所のファイアウォールデバイスにエラーが発生して交換されました。 VPNトンネルを開き、FTPが機能し、ファイルを転送できますが、ファイルを削除するとスクリプトがクラッシュします。
スクリプトは、進行中のFTP転送を識別するためにローカルファイル(「ロックファイル」と呼ばれる)を作成します。ファイルは、スクリプトがそれを識別できるようにファイル名にPIDを使用します。その後、FTP転送後、スクリプトはファイルを削除して転送プロセスが完了したことを明確に示します。 FTP転送完了 - ファイルが転送されました。 FTPセッションが閉じられたというメッセージが画面に表示されます。ただし、ロックされたファイルを削除するとスクリプトは停止します。
また、スクリプトは「使用されていない」ロックファイルの削除もサポートしていますが、これもできません。
ターゲットシステムのファイアウォールがローカルシステムにどのような影響を与えるかは不明ですが、これは症状です。
現在、システム管理者はいません。私は現在、このニッチ市場を埋めようとするプログラマーです。私は「粘着性のあるビット」について何も知りません。ここに明らかなことはありますか?どこを見なければならないかについての手がかりがあれば感謝します。
スクリプトは次のとおりです。
# Usage: storeftpputall machine
set -x
MACHINE=$1 # name of remote machine
USERNAME='ftpstore'
PASS='ftppassword'
PUBDIR='/u/ftpstore' # Transfer directory tree
INDIR='transfer/in' # Remote system, where files go in
MYNOWPID=$$ # Proc ID of this process.
# Make sure no other storeftpputs are running to that store,
# else you could get an attempted overwrite, or at least overload
# the modem line. Use PID lock files.
# Check for PID file locking ftp to remote store
if [ -f /usr/tmp/$MACHINE.put.* ]
then
STORELOKPID1=''
STORELOKPID1=`ls /usr/tmp/$MACHINE.put.* | sed -e "s|$MACHINE\.put\.||g"`
for j in $STORELOKPID1
do
k=`basename $j`
LIVEPID=`ps -ef | grep $k | grep -v 'grep'`
if [ -n "$LIVEPID" ]
then
echo 'Storeftpput script already in progress. Please wait'
sleep 2
else
echo "Removing stale lockfile $MACHINE.$k"
rm "/usr/tmp/$MACHINE.put.$k" # Remove stale lock file
sleep 2
fi
done
fi
# Any stale locks should be gone. Wait for any live
# storeftpput scripts to finish and remove their own lockfiles,
# then proceed.
while [ -f /usr/tmp/$MACHINE.put.* ]
do
echo 'Storeftpput script already in progress. Please wait.'
echo "Retrying at 45 second intervals."
sleep 45
done
# Assert own lockfile on line
touch /usr/tmp/$MACHINE\.put\.$MYNOWPID
chmod 664 /usr/tmp/$MACHINE\.put\.$MYNOWPID
# Check for outbound store files. If found, send them.
cd $PUBDIR/out/$MACHINE
if [ -f *.tar.Z ]
then
NUMBER=`ls *.tar.Z|sed -e "s|\.tar\.Z||g"` # Get tar file numbers
for j in $NUMBER # May be more than one
do
ftp -i -n -v $MACHINE <<-EndFTP
user $USERNAME $PASS
cd $INDIR
lcd $PUBDIR/out/$MACHINE
binary
hash
put $j.tar.Z
chmod 666 $j.tar.Z
close
EndFTP
rm $j.tar.Z
done
fi
# Remove storeftpput lockfile
rm /usr/tmp/$MACHINE\.put\.$MYNOWPID
echo "Done..."
sleep 1
答え1
/usr/tmp/$MACHINE.put.$MYNOWPID と同じパスを使用するのはなぜですか?
/usr/tmp/$MACHINE/.put/.$MYNOWPID を使用しないでください。
答え2
明らかなことはありませんが…
実際のメッセージは質問には記載されていませんが、コンテキストではこのコメントの後のループのように聞こえます。
# Any stale locks should be gone. Wait for any live
このスクリプトにはいくつかの問題があります。
- 演算子の使用をテストします。これらの式のワイルドカードが複数の項目と一致すると、スクリプトが中断される可能性があります。
if [ -f /usr/tmp/$MACHINE.put.* ] そして[ -f /usr/tmp/$MACHINE.put.* ] if [ -f *.tar.Z ]
- sed 式にシェル特殊文字を使用または引用します。たとえば、次のようになります。
NUMBER=`ls *.tar.Z|sed -e "s|\.tar\.Z||g"` # tar ファイル番号の取得
ホストシステムによっては正しく機能しない可能性がありますsed
(他のスクリプトでは、あいまいさの問題を避けるためにカンマまたはパーセント記号を使用することがよくあります)。