파일 삭제에 대한 질문을 다시 게시합니다. 두 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
(다른 스크립트에서는 모호성 문제를 피하기 위해 종종 쉼표나 백분율 기호를 사용합니다).