나는 사용하고있다
mount -o bind /some/directory/here /foo/bar
/foo/bar
bash 스크립트 로 확인 하고 마운트 되었는지 확인 하고 싶습니다 . 그렇지 않은 경우 위의 mount 명령을 호출하고 다른 작업을 수행하십시오. 어떻게 할 수 있습니까?
CentOS는 운영 체제입니다.
나는 사용하고있다
mount -o bind /some/directory/here /foo/bar
/foo/bar
bash 스크립트 로 확인 하고 마운트 되었는지 확인 하고 싶습니다 . 그렇지 않은 경우 위의 mount 명령을 호출하고 다른 작업을 수행하십시오. 어떻게 할 수 있습니까?
CentOS는 운영 체제입니다.
답변:
mount
인수없이 명령을 실행하면 현재 마운트를 알 수 있습니다. 쉘 스크립트에서 grep
및 if 문 을 사용하여 마운트 지점을 확인할 수 있습니다 .
if mount | grep /mnt/md0 > /dev/null; then
echo "yay"
else
echo "nay"
fi
내 예에서 if 문은 grep
일치가 있는지 여부를 나타내는 종료 코드를 확인합니다 . 일치하는 항목이있을 때 출력이 표시되는 것을 원하지 않기 때문에 /dev/null
.
grep
일치하는 항목이 없으면 0이 아닌 종료 상태를 반환합니다. 테스트 나 $ ()에 의해 생성 된 서브 쉘이 필요하지 않습니다. if command | grep -q 'stuff'; then ...
mount | grep ...
마운트 바인드가 여전히 활성 상태임을 보여주는 것에 의존 할 수 없습니다 . 기본 장치가 마운트 해제되고 다시 마운트되면 마운트 바인드가 실제로 mount
연결되어 있음을 표시 하더라도 더 이상 두 파일 / 디렉토리를 더 이상 연결하지 않습니다 . 그리고 그렇게하면 umount ...
마운트되지 않았다고 말할 수도 있습니다 mount
. 리눅스 파일 시스템의 엄청난 결함.
readlink -f
경로 / 파일이 존재하지 않을 때 아무것도 반환하지 않는을 사용하려고 합니다. 기본 / mount / path / to_file이 없으면 (readlink 당) 기본 마운트가 중단 된 것입니다 (기본 마운트와 바인딩을 다시 마운트). 기본 파일이 있고 readlink -f
해당 파일의 바인딩 버전이없는 경우 바인딩이 끊어진 것이므로 바인딩을 다시 마운트하면됩니다.
/mnt/md0xxx
명령은 /mnt/md0
마운트 된 것으로 표시 되지만 그럴 필요는 없습니다 ...
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
도움이 되었기를 바랍니다.
의 설명서는 다음과 mountpoint
같이 말합니다.
주어진 디렉토리 나 파일이 / proc / self / mountinfo 파일에 언급되어 있는지 확인합니다.
의 설명서는 다음과 mount
같이 말합니다.
목록 모드는 이전 버전과의 호환성을 위해서만 유지됩니다. 보다 강력하고 사용자 정의 가능한 출력을 위해 특히 스크립트에서 findmnt (8)를 사용하십시오.
따라서 사용할 올바른 명령findmnt
은 util-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"
나는 사용하는 대답을 좋아 /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
mountpoint
하거나 findmnt
존재 하지 않는 소형 임베디드 시스템에 원하는 것입니다 . 매우 간단한 대답, 많은 기쁨, 그런 UNIX :)
내 솔루션 :
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
.또 다른 깨끗한 솔루션은 다음과 같습니다.
$ mount | grep /dev/sdb1 > /dev/null && echo mounted || echo unmounted
확실히, 'echo something'은 각 경우에 필요한 모든 작업으로 대체 될 수 있습니다.