Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

What's the best way to check if a volume is mounted in a Bash script?

What I'd really like is a method that I can use like this:

if <something is mounted at /mnt/foo> 
then
   <Do some stuff>
else
   <Do some different stuff>
fi
share|improve this question
    
I was just about to write a script to do this myself. My first thought is to get info out of /etc/mtab But I haven't thumbed through my bash books yet to see if there's a more direct way. –  3dinfluence Aug 5 '09 at 20:23
    
@3dinfluence - yes I know this from a long time ago, but /etc/mtab, /proc/mounts are linked to /proc/self/mounts. (atleast on Fedora 20 it is) –  Wilf Jan 16 at 20:24
add comment

12 Answers

up vote 37 down vote accepted

Avoid using /etc/mtab because it may be inconsistent.

Avoid piping mount because it needn't be that complicated.

Simply:

if grep -qs '/mnt/foo' /proc/mounts; then
    echo "It's mounted."
else
    echo "It's not mounted."
fi
share|improve this answer
3  
Not to mention, a call to mount can hang if the mountpoint is wedged. –  Chad Huneycutt Aug 5 '09 at 20:32
4  
Good for linux, not for freebsd or solaris. –  chris Aug 5 '09 at 20:34
2  
This is true, chris. Although the question was tagged linux. –  Dan Carley Aug 5 '09 at 20:38
2  
I guess this is a philosophical question -- should we attempt to make things portable if possible or should we just assume that all the world's running windows/linux and act accordingly? –  chris Aug 5 '09 at 20:47
8  
Actually, you should test for '/mnt/foo ', ie. with a space or you might get a false positive if you had mounted a volume named eg. 'fooks'. I just got that issue with two mount points, 'lmde' and 'lmde-home'. –  marlar Aug 12 '11 at 20:21
show 13 more comments
if mountpoint -q /mnt/foo 
then
   echo "mounted"
else
   echo "not mounted"
fi

or

mountpoint -q /mnt/foo && echo "mounted" || echo "not mounted"
share|improve this answer
2  
Just for information: mountpoint originates in the "initscripts" package in Ubuntu/Debian. –  blueyed Sep 25 '12 at 8:49
    
Didn't work for me - :-( –  Wilf Jan 16 at 20:25
add comment

the following is what i use in one of my rsync backup cron-jobs. it checks to see if /backup is mounted, and tries to mount it if it isn't (it may fail because the drive is in a hot-swap bay and may not even be present in the system)

NOTE: the following only works on linux, because it greps /proc/mounts - a more portable version would run 'mount | grep /backup', as in Matthew's answer..

  if ! grep -q /backup /proc/mounts ; then
    if ! mount /backup ; then
      echo "failed"
      exit 1
    fi
  fi
  echo "suceeded."
  # do stuff here
share|improve this answer
    
Upvoted as a good sanity checking alternative. –  Dan Carley Aug 5 '09 at 21:11
add comment

A script like this isn't ever going to be portable. A dirty secret in unix is that only the kernel knows what filesystems are where, and short of things like /proc (not portable) it'll never give you a straight answer.

I typically use df to discover what the mount-point of a subdirectory is, and what filesystem it is in.

For instance (requires posix shell like ash / AT&T ksh / bash / etc)

case $(df  $mount)
in
  $(df  /)) echo $mount is not mounted ;;
  *) echo $mount has a non-root filesystem mounted on it ;;
esac

Kinda tells you useful information.

share|improve this answer
    
The question is tagged linux, so maybe it doesn't have to be portable –  Rory Aug 10 '09 at 15:59
add comment

Since in order to mount, you need to have a directory there anyway, that gets mounted over, my strategy was always to create a bogus file with a strange filename that would never be used, and just check for it's existence. If the file was there, then nothing was mounted on that spot...

I don't think this works for mounting network drives or things like that. I used it for flash drives.

share|improve this answer
    
ghetto, but I like it :) +1 –  Chad Huneycutt Aug 5 '09 at 21:29
    
I never said it was pretty B-) –  Brian Postow Nov 3 '09 at 22:06
add comment

None of these satisfy the use case where a given directory is a sub directory within another mount point. For example, you might have /thing which is an NFS mount to host:/real_thing. Using grep for this purpose on /proc/mounts /etc/mtab or 'mount' will not work, because you will be looking for a mount point that doesn't exist. For example, /thing/thingy is not a mount point, but /thing is mounted on host:/real_thing. The best answer voted on here is actually NOT "the best way to determine if a directory/volumne is mounted". I'd vote in favour using 'df -P' (-P POSIX standards mode) as a cleaner strategy:

dev=`df -P /thing/thingy | awk 'BEGIN {e=1} $NF ~ /^\/.+/ { e=0 ; print $1 ; exit } END { exit e }'` && {
    echo "Mounted via: $dev"
} || {
    echo "Not mounted"
}

The output from running this will be:

Mounted via: host:/real_thing

If you want to know what the real mount point is, no problem:

mp=`df -P /thing/thingy | awk 'BEGIN {e=1} $NF ~ /^\/.+/ { e=0 ; print $NF ; exit } END { exit e }'` && {
    echo "Mounted on: $mp"
} || {
    echo "Not mounted"
}

The output from that command will be:

Mounted on: /thing

This is all very useful if you are trying to create some sort of chroot that mirrors mount points outside of the chroot, within the chroot, via some arbitrary directory or file list.

share|improve this answer
add comment

grep /etc/mtab for your mount point maybe?

share|improve this answer
    
mtab can get out of date or simply not be updated by mount, such as when you use mount -n because / is read-only. –  chris Aug 5 '09 at 20:33
    
I agree, but that seemed like the first place to start looking. –  Ophidian Aug 5 '09 at 21:30
add comment

This?:

volume="/media/storage"
if mount|grep $volume; then
echo "mounted"
else
echo "not mounted"
if

From: An Ubuntu forum

share|improve this answer
add comment

Does it need to be any more complicated than:

`mount | cut -f 3 -d ' ' | grep -q /mnt/foo && echo "mounted" || echo "not mounted"`

?

share|improve this answer
    
grep -q /mnt/foo will also match mount points /mnt/food and /not/mnt/foo... How about grep -qx /mnt/foo? –  rakslice Nov 2 '12 at 0:51
    
@rakslice: that wouldn't work. -x makes grep match only if the whole line matches. –  mivk Dec 17 '12 at 22:37
add comment

How about comparing devices numbers? I was just trying to think of the most esoteric way..

#!/bin/bash
if [[ $(stat -c "%d" /mnt) -ne $(stat -c "%d" /mnt/foo) ]]; then
    echo "Somethin mounted there I reckon"
fi

There a flaw in my logic with that ...

As a Function:

#!/usr/bin/bash
function somethingMounted {
        mountpoint="$1"
        if ! device1=$(stat -c "%d" $mountpoint); then
                echo "Error on stat of mount point, maybe file doesn't exist?" 1>&2
                return 1
        fi
        if ! device2=$(stat -c "%d" $mountpoint/..); then
                echo "Error on stat one level up from mount point, maybe file doesn't exist?" 1>&2
                return 1
        fi

        if [[ $device1 -ne $device2 ]]; then
                #echo "Somethin mounted there I reckon"
                return 0
        else
                #echo "Nothin mounted it seems"
                return 1
        fi
}

if somethingMounted /tmp; then
        echo "Yup"
fi

The echo error messages are probably redundant, because stat will display the an error as well.

share|improve this answer
    
Actually, would probably have to check the exit status of stat first for each call to make sure the file is there ... not as novel as I thought :-( –  Kyle Brandt Aug 5 '09 at 21:08
add comment

Although this is a Linux question, why not make it portable when it is easily done?

The manual page of grep says: Portable shell scripts should avoid both -q and -s and should redirect standard and error output to /dev/null instead.

So I propose the following solution:

if grep /mnt/foo /proc/mounts > /dev/null 2>&1; then
        echo "Mounted"
else
        echo "NOT mounted"
fi
share|improve this answer
    
Many UNIX systems do not provide the /proc filesystem –  Dmitri Chubarov Apr 27 '12 at 19:09
add comment

Sorry for bringing this up but I think this is pretty usefull:

if awk '{print $2}' /proc/mounts | grep -qs "^/backup$"; then
    echo "It's mounted."
else
    echo "It's not mounted."
fi

This gets the 2nd column of /proc/mounts (2nd column = mount points).

Then it greps the output. Note the ^ and $, this prevents /backup from matching /mnt/backup or /backup-old etc.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.