bash로 디렉토리가 마운트되었는지 확인하십시오.


94

나는 사용하고있다

mount -o bind /some/directory/here /foo/bar

/foo/barbash 스크립트 로 확인 하고 마운트 되었는지 확인 하고 싶습니다 . 그렇지 않은 경우 위의 mount 명령을 호출하고 다른 작업을 수행하십시오. 어떻게 할 수 있습니까?

CentOS는 운영 체제입니다.


"if [[$ (mount -l ... | fgrep ... | wc -l)]]; then ..."
bobah

비슷한 질문이 Server Fault , Stack OverflowUnix & Linux Stack Exchange에 있습니다.
Sasha

답변:


70

mount인수없이 명령을 실행하면 현재 마운트를 알 수 있습니다. 쉘 스크립트에서 grep및 if 문 을 사용하여 마운트 지점을 확인할 수 있습니다 .

if mount | grep /mnt/md0 > /dev/null; then
    echo "yay"
else
    echo "nay"
fi

내 예에서 if 문은 grep일치가 있는지 여부를 나타내는 종료 코드를 확인합니다 . 일치하는 항목이있을 때 출력이 표시되는 것을 원하지 않기 때문에 /dev/null.


4
문자열을 반환하는지 확인할 필요가 없습니다. grep일치하는 항목이 없으면 0이 아닌 종료 상태를 반환합니다. 테스트 나 $ ()에 의해 생성 된 서브 쉘이 필요하지 않습니다. if command | grep -q 'stuff'; then ...
jordanm 2012

31
이것은 마운트 바인드에서 작동하지 않으므로 대답으로 받아 들여서는 안됩니다. 이 답변은 투표를 취소해야합니다. mount | grep ...마운트 바인드가 여전히 활성 상태임을 보여주는 것에 의존 할 수 없습니다 . 기본 장치가 마운트 해제되고 다시 마운트되면 마운트 바인드가 실제로 mount연결되어 있음을 표시 하더라도 더 이상 두 파일 / 디렉토리를 더 이상 연결하지 않습니다 . 그리고 그렇게하면 umount ...마운트되지 않았다고 말할 수도 있습니다 mount. 리눅스 파일 시스템의 엄청난 결함.
Dev Null

@DevNull : 설명하신 문제를 정확히 알고 있습니다. 이 문제에 대한 해결책이 있습니까?
Isaac

@Isaac, 응답이 지연되어 죄송합니다. readlink -f경로 / 파일이 존재하지 않을 때 아무것도 반환하지 않는을 사용하려고 합니다. 기본 / mount / path / to_file이 없으면 (readlink 당) 기본 마운트가 중단 된 것입니다 (기본 마운트와 바인딩을 다시 마운트). 기본 파일이 있고 readlink -f해당 파일의 바인딩 버전이없는 경우 바인딩이 끊어진 것이므로 바인딩을 다시 마운트하면됩니다.
Dev Null

2
호출 된 마운트가있는 경우 /mnt/md0xxx명령은 /mnt/md0마운트 된 것으로 표시 되지만 그럴 필요는 없습니다 ...
David L.

178

O / S를 언급하지 않았습니다.

Ubuntu Linux 11.10 (및 대부분의 최신 Linux 버전)에는 mountpoint명령이 있습니다.

다음은 내 서버 중 하나의 예입니다.

$ mountpoint /oracle
/oracle is a mountpoint
$ mountpoint /bin
/bin is not a mountpoint

실제로 귀하의 경우 다음 -q과 같이 옵션 을 사용할 수 있어야합니다 .

mountpoint -q /foo/bar || mount -o bind /some/directory/here /foo/bar

도움이 되었기를 바랍니다.


7
'mountpoint'명령을 실행할 때 실제로 마운트 된 것이 있습니까? 마운트 지점으로 의도 된 경우에도 실제로 마운트 된 것이 없으면 디렉토리 일뿐입니다.
Mark J. Bobak 2012

2
+1, Ubuntu 10.10에서도 작동합니다. 8.04 이후 우분투에있었습니다 .
l0b0

3
mountpoint는 RHEL 6.3에도 있습니다 (아마 이전 버전에서도 가능)
Joril

2
mountpoint가 존재하며 Debian 7 ( "Wheezy") 및 UCS 4에서도 완벽하게 작동합니다.
Lahmizzar

7
다른 주석 마운트 지점 에서 언급했듯이 바인드 마운트에서는 작동하지 않습니다. 코드 조각은 디렉토리를 여러 번 마운트
csanchez

40

의 설명서는 다음과 mountpoint같이 말합니다.

주어진 디렉토리 나 파일이 / proc / self / mountinfo 파일에 언급되어 있는지 확인합니다.

의 설명서는 다음과 mount같이 말합니다.

목록 모드는 이전 버전과의 호환성을 위해서만 유지됩니다. 보다 강력하고 사용자 정의 가능한 출력을 위해 특히 스크립트에서 findmnt (8)를 사용하십시오.

따라서 사용할 올바른 명령findmntutil-linux패키지의 일부이며 설명서에 따라 다음과 같습니다.

/ etc / fstab, / etc / mtab 또는 / proc / self / mountinfo에서 검색 할 수 있습니다.

따라서 실제로 mountpoint. 또한 편리한 옵션을 제공합니다.

-M, --mountpoint 경로

마운트 지점 파일 또는 디렉토리를 명시 적으로 정의하십시오. --target도 참조하십시오.

요약하면 디렉토리가 bash로 마운트되었는지 확인하려면 다음을 사용할 수 있습니다.

if [[ $(findmnt -M "$FOLDER") ]]; then
    echo "Mounted"
else
    echo "Not mounted"
fi

예:

mkdir -p /tmp/foo/{a,b}
cd /tmp/foo

sudo mount -o bind a b
touch a/file
ls b/ # should show file
rm -f b/file
ls a/ # should show nothing

[[ $(findmnt -M b) ]] && echo "Mounted"
sudo umount b
[[ $(findmnt -M b) ]] || echo "Unmounted"

2

나는 사용하는 대답을 좋아 /proc/mounts하지만 간단한 grep을하는 것을 좋아하지 않습니다. 그것은 당신에게 오탐을 줄 수 있습니다. 정말로 알고 싶은 것은 "어떤 행에 필드 번호 2에 대한 정확한 문자열이 있는가 "입니다. 그래서 그 질문을하십시오. (이 경우 확인 중입니다 /opt)

awk -v status=1 '$2 == "/opt" {status=0} END {exit status}' /proc/mounts

# and you can use it in and if like so:

if awk -v status=1 '$2 == "/opt" {status=0} END {exit status}' /proc/mounts; then
  echo "yes"
else
  echo "no"
fi

1
이것은 사랑 스럽습니다! 화려한 도구가 좋아 mountpoint하거나 findmnt존재 하지 않는 소형 임베디드 시스템에 원하는 것입니다 . 매우 간단한 대답, 많은 기쁨, 그런 UNIX :)
troglobit

1

내 솔루션 :

is_mount() {
    path=$(readlink -f $1)
    grep -q "$path" /proc/mounts
}

예:

is_mount /path/to/var/run/mydir/ || mount --bind /var/run/mydir/ /path/to/var/run/mydir/

들어 마크 J. Bobak의 대답 , mountpoint마운트하면 작동하지 bind다른 파일 시스템에서 옵션을 선택합니다.

Christopher Neylan의 대답에 대해서는 grep의 출력을 / dev / null로 리디렉션 할 필요가 없으며 grep -q대신 사용하십시오.

가장 중요한 것은readlink -f $mypath 다음 을 사용하여 경로를 정규화하는 것입니다 .

  • /path/to/dir/end with backslash와 같은 경로를 확인 하면 경로 /proc/mounts또는 mount출력은/path/to/dir
  • 대부분의 리눅스 버전에서 /var/run/의 심볼릭 링크입니다 /run/당신이 바인드 마운트 그렇다면, /var/run/mypath그것은 설치하는 경우, 그것은로 표시됩니다 확인 /run/mypath에서 /proc/mounts.

2
"grep -q"$ path "/ proc / mounts"(공백 포함)가 더 낫다고 생각합니다 ... 그렇지 않으면 abc가 마운트되면 is_mount ab가 true를 반환합니까?!
alfonx

0

또 다른 깨끗한 솔루션은 다음과 같습니다.

$ mount | grep /dev/sdb1 > /dev/null && echo mounted || echo unmounted

확실히, 'echo something'은 각 경우에 필요한 모든 작업으로 대체 될 수 있습니다.


이것은 @ChristopherNeylan의 대답과 똑같은 일을하고 있습니다.
Jonathan H

0

여기에 대한 대답은 너무 복잡합니다. 다음을 사용하여 마운트가 있는지 확인하십시오.

cat /proc/mounts | tail -n 1

마지막으로 마운트 된 폴더 만 출력합니다. 모든 폴더를 보려면 tail 명령 만 제거하면됩니다.


-4

내 .bashrc에서 다음 별칭을 만들었습니다.

alias disk-list="sudo fdisk -l"

요청은 스크립트에 관한 것이며 "디스크 파티션 조작"을 대상으로하는 sudo 및 프로그램을 피하는 것이 가장 좋습니다
bcag2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.