ボリュームがBashスクリプトにマウントされているかどうかを確認する最良の方法は何ですか?
私が本当に望んでいるのは、このように使用できる方法です。
if <something is mounted at /mnt/foo>
then
<Do some stuff>
else
<Do some different stuff>
fi
/etc/mtab
は一貫性がない可能性があるため、使用しないでください。
それほど複雑にする必要がないため、mount
のパイプは避けてください。
単に:
if grep -qs '/mnt/foo ' /proc/mounts; then
echo "It's mounted."
else
echo "It's not mounted."
fi
(/mnt/foo
の後のスペースは、たとえば/mnt/foo-bar
のような一致を避けるためです。)
if mountpoint -q /mnt/foo
then
echo "mounted"
else
echo "not mounted"
fi
または
mountpoint -q /mnt/foo && echo "mounted" || echo "not mounted"
findmnt -rno SOURCE,TARGET "$1"
他の回答のすべての問題を回避します。それはたった1つのコマンドできれいに仕事をします。
他のアプローチにはこれらの欠点があります:
grep -q
およびgrep -s
は余分な不要なステップであり、すべての場所でサポートされているわけではありません。/proc/\*
はどこでもサポートされているわけではありません。mountinfo
は/ proc /に基づいています。cut -f3 -d' '
パス名のスペースを混乱させる..リストモードは、下位互換性のためにのみ維持されています。
より堅牢でカスタマイズ可能な出力には、特にスクリプトでfindmnt(8)を使用します。
Bash関数:
#These functions return exit codes: 0 = found, 1 = not found
isMounted () { findmnt -rno SOURCE,TARGET "$1" >/dev/null;} #path or device
isDevMounted () { findmnt -rno SOURCE "$1" >/dev/null;} #device only
isPathMounted() { findmnt -rno TARGET "$1" >/dev/null;} #path only
#where: -r = --raw, -n = --noheadings, -o = --output
使用例:
if isPathMounted "/mnt/foo bar"; #Spaces in path names are ok.
then echo "path is mounted"
else echo "path is not mounted"
fi
if isDevMounted "/dev/sdb4";
then echo "device is mounted"
else echo "device is not mounted"
fi
#Universal:
if isMounted "/mnt/foo bar";
then echo "device is mounted"
else echo "device is not mounted"
fi
if isMounted "/dev/sdb4";
then echo "device is mounted"
else echo "device is not mounted"
fi
このようなスクリプトは移植可能にはなりません。 unixのひっそりとした秘密は、カーネルだけがファイルシステムがどこにあるかを知っており、/ proc(ポータブルではない)のようなものが不足していると、正直な答えが得られないことです。
私は通常、dfを使用して、サブディレクトリのマウントポイントとは何か、それがどのファイルシステムにあるかを調べます。
たとえば(ash/AT&T ksh/bashなどのposix Shellが必要です)
case $(df $mount)
in
$(df /)) echo $mount is not mounted ;;
*) echo $mount has a non-root filesystem mounted on it ;;
esac
ちょっと便利な情報を教えてくれます。
以下は、rsyncバックアップcronジョブの1つで使用するものです。/backupがマウントされているかどうかを確認し、マウントされていない場合はマウントを試みます(ドライブがホットスワップベイにあり、システムに存在していない可能性があるために失敗する可能性があります)
注:以下は、/ proc/mountsを読み取るため、Linuxでのみ機能します。よりポータブルなバージョンでは、「mount |マシューの答えのように、grep/backup '。
もし! grep -q/backup/proc/mounts;次に もし! mount/backup;次に、 echo "失敗しました" exit 1 fi fi echo "suceeded。" #ここで何かを行います
マウントするためには、とにかくそこにマウントされるディレクトリが必要なので、私の戦略は常に、決して使用されない奇妙なファイル名で偽のファイルを作成し、その存在を確認することでした。ファイルがあった場合、その場所には何もマウントされていません...
私はこれがネットワークドライブなどをマウントするのにうまくいくとは思いません。フラッシュドライブに使用しました。
デバイス数を比較してみませんか?私はちょうど難解な方法を考えようとしていました。
#!/bin/bash
if [[ $(stat -c "%d" /mnt) -ne $(stat -c "%d" /mnt/foo) ]]; then
echo "Somethin mounted there I reckon"
fi
それで私の論理に欠陥があります...
関数として:
#!/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
Statもエラーを表示するため、エコーエラーメッセージはおそらく冗長です。
これを取り上げて申し訳ありませんが、これはかなり便利だと思います:
if awk '{print $2}' /proc/mounts | grep -qs "^/backup$"; then
echo "It's mounted."
else
echo "It's not mounted."
fi
/ proc/mountsの2列目を取得します(2列目=マウントポイント)。
次に、出力を読み取ります。 ^と$に注意してください。これにより、/ backupが/ mnt/backupまたは/ backup-oldなどと一致しなくなります。
これらはいずれも、特定のディレクトリが別のマウントポイント内のサブディレクトリである場合の使用例を満たしていません。たとえば、Host:/ real_thingへのNFSマウントである/ thingがあるとします。/proc/mounts/etc/mtabまたは 'mount'でこの目的のためにgrepを使用しても、存在しないマウントポイントを探すため、機能しません。たとえば、/ thing/thingyはマウントポイントではありませんが、/ thingはHost:/ real_thingにマウントされます。ここで投票した最良の答えは、実際には「ディレクトリ/ボリュームがマウントされているかどうかを判断する最良の方法」ではありません。クリーンな戦略として「df -P」(-P POSIX標準モード)を使用して賛成票を投じます。
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"
}
これを実行すると、次のように出力されます。
Mounted via: Host:/real_thing
実際のマウントポイントを知りたい場合は、問題ありません。
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"
}
そのコマンドの出力は次のようになります。
Mounted on: /thing
これは、chroot内の任意のディレクトリまたはファイルリストを介して、chrootの外部のマウントポイントをミラーリングするchrootの種類を作成しようとしている場合に非常に役立ちます。
チェックするボリュームについて知っていることに依存します。
私が最近調査した特定のケースでは、特定のフラッシュドライブがマウントされているかどうかを確認する必要があり、最も簡単に機能するのは、/ dev/disks/by-label /の存在を確認することです。デバイスが接続されている場合、udevスクリプトはリンクが存在すること(およびデバイスが接続されていないときにリンクが削除されること)を確認します。
(これは移植性の高い答えではありません。ただし、多くの最新のLinuxディストリビューションで機能します。質問はLinuxにタグ付けされており、これまでに述べたものとはまったく異なるアプローチなので、可能性が広がります。)
/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
これはLinuxの質問ですが、簡単に実行できる場合は移植可能にしてみませんか?
grep
のマニュアルページにはこう書かれています:
ポータブルシェルスクリプトは、-qと-sの両方を回避し、標準出力とエラー出力を
/dev/null
にリダイレクトする必要があります。
だから私は次の解決策を提案します:
if grep /mnt/foo /proc/mounts > /dev/null 2>&1; then
echo "Mounted"
else
echo "NOT mounted"
fi
マウントポイントのgrep/etc/mtabは多分?
これより複雑にする必要はありますか?
mount \
| cut -f 3 -d ' ' \
| grep -q /mnt/foo \
&& echo "mounted" || echo "not mounted"
この?:
volume="/media/storage"
if mount|grep $volume; then
echo "mounted"
else
echo "not mounted"
if
From: buntuフォーラム
check_mount
のようなマウントポイントの下にファイルを作成し、それが存在するかどうかをテストしますか?
if [[ -f /something/check_mount ]]; then
echo "Mounted
RC=$?
else
Echo "Not mounted"
RC=0
fi
exit $RC