重新发布有关删除文件的问题。我们有一个脚本用于在两个 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
该脚本有一些可能的问题:
- 它对测试操作符的使用。如果这些表达式中的通配符匹配多个项目,则脚本可能会崩溃:
如果 [ -f /usr/tmp/$MACHINE.put.* ] 而[ -f /usr/tmp/$MACHINE.put.* ] 如果 [ -f *.tar.Z ]
- 在 sed 表达式中使用(甚至引用)shell 特殊字符,例如,
NUMBER=`ls *.tar.Z|sed -e "s|\.tar\.Z||g"` # 获取 tar 文件编号
根据主机系统的不同,sed
可能表现不佳(其他脚本通常使用逗号或百分号,以避免出现模糊问题)。