rm -rf: `/opt/jetty' を削除できません。ディレクトリが空ではありません。

rm -rf: `/opt/jetty' を削除できません。ディレクトリが空ではありません。

以下を使用してフォルダを削除するスクリプトがあります。

ssh -q root@hostname sh -c 'rm -rf /opt/jetty/'

ほとんどの場合はうまく機能しますが、時々次のメッセージが表示されます。

rm: `/opt/jetty' を削除できません。ディレクトリが空ではありません。

唯一の疑いは、削除するフォルダにflockファイルロックを取得するためにシェルコマンドで使用されるロックファイルが含まれていることです。しかし、ファイルがロックされている間にフォルダを手動で削除しようとしましたが、うまくいきflockました。

修正する:


環境はLinuxです

# uname -a
Linux XXX 2.6.32-504.8.1.el6.x86_64 #1 SMP Fri Dec 19 12:09:25 EST 2014 x86_64 x86_64 x86_64 GNU/Linux

rmはエイリアスを指定せず、rmの出力は次のようになります。

# rm
rm: missing operand
Try `rm --help' for more information.

Jettyを起動し、フォルダ内にファイルロックを生成するサービススクリプトがあります。一部のスニペットは次のとおりです。

JETTY_LOCK=/opt/jetty/jetty_lock

start(){
    #open file descriptor and acquire lock
    exec 200>$JETTY_LOCK
    flock -x -n 200 || { exec 200>&-;echo 'jetty is being started by another process.'; sleep 5; exit 0; }
    ...
    cd /opt/jetty/
   ...
    echo $!>&200
    fi
    flock -u 200  #release lock
    exec 200>&-   #close file descriptor
}

修正する:


エラーが再び表示された後、int /opt/jettyにjetty_lockファイルのみが残っていることがわかりました。これは、flockファイルロックが削除されないことを意味しますか?次はいつになるのかわからないので、詳しくは申し上げません。

答え1

SSHセッションをデバッグするには、「-q」の代わりに「-v」オプションを使用して出力を分析します。

リモートコマンドに絶対パスを使用してみてください。だからこれは次のようになります:

# ssh -v root@hostname/bin/sh -c '/bin/rm -rf /opt/jetty/'

関連情報