사용자가 자신이 만든 파일을 삭제할 수 없는 이유

사용자가 자신이 만든 파일을 삭제할 수 없는 이유

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

관련 정보