2

I have a script using the following command to remove a folder:

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

Most of the times it works fine, but occasionally I get this message:

rm: cannot remove `/opt/jetty': Directory not empty

The only suspicious point is the folder to delete contains a lock file which is being used by shell command flock to acquire file lock. But I tried to remove the folder manually when the file was even being locked by flock, it get succeeded.

update:


The environment is 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 didn't alias to anything, the out put of rm:

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

I have a service script to start Jetty which creates a file lock inside the folder. Some snippet as shown below:

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
}

update:


After the error reproduced, I found only jetty_lock file was still remaining int /opt/jetty, does that mean flock stops file lock from deleting? I cannot provide more details because I don't know when will it happen the next time...

7
  • Are new files commonly created in that directory? May 5, 2015 at 9:18
  • hi @MichaelHomer, no new files except the lock file is created in that directory. May 5, 2015 at 9:22
  • Is this on Linux? Which one? Is rm aliased to anything? What is the output of type rm? Please edit your question and add this information.
    – terdon
    May 5, 2015 at 10:05
  • 1
    The other thing that you can tell people is whether you can reproduce this when your jetty service is not running. After all, jetty has a whole temporary files directory in /opt/jetty/temp, for starters.
    – JdeBP
    May 5, 2015 at 11:24
  • If you change the command to ssh -q root@hostname sh -c 'rm -rf /opt/jetty/ || ls -la /opt/jetty/', does it output anything? May 5, 2015 at 13:46

1 Answer 1

-3

To debug ssh session use "-v" option instead of "-q" and analize the output.

Try to use absolute paths in remote command. So this looks like:

# ssh -v root@hostname /bin/sh -c '/bin/rm -rf /opt/jetty/'
5
  • or use ssh -vvv for lots of detail
    – Skaperen
    May 5, 2015 at 10:42
  • 4
    This question is a race between an rm command and a running jetty service that is using/creating files and directories in the directory being removed. It's not really addressed by looking at the SSH protocol or giving a different name for the shell. Both of those are obviously working.
    – JdeBP
    May 5, 2015 at 11:10
  • hi @JdeBP , do you mean the file lock cannot be removed by 'rm -rf'? May 6, 2015 at 1:45
  • When you use sh instead of bash you have different alias. So you have to use absolute path. I don't know your environment, but /bin/rm -fr have to function. Are you sure remote filesystem is not in read-only mode?
    – alex87alex
    May 7, 2015 at 8:12
  • hi @alex87alex I'm sure remote filesystem is not in read-only mode because all the files in the folder have been deleted except the one serves as file lock. May 8, 2015 at 2:55

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .