GNU/Linux >> Linux の 問題 >  >> Linux

ボリュームが Bash スクリプトでマウントされているかどうかを確認する最良の方法は何ですか?

解決策 1:

/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 .)

解決策 2:

if mountpoint -q /mnt/foo 
then
   echo "mounted"
else
   echo "not mounted"
fi

または

mountpoint -q /mnt/foo && echo "mounted" || echo "not mounted"

解決策 3:

findmnt -rno SOURCE,TARGET "$1" 他の回答のすべての問題を回避します。たった 1 つのコマンドでジョブをきれいに実行します。

他のアプローチには次の欠点があります:

  • grep -qgrep -s 不要な手順であり、どこでもサポートされているわけではありません。
  • /proc/\* どこでもサポートされているわけではありません。 (mountpoint も proc に基づいています)。
  • mountinfo /proc/.. に基づいています
  • cut -f3 -d' ' パス名のスペースを台無しにする
  • マウントを解析しています の空白が問題です。 man ページには次のように書かれています:
<ブロック引用>

.. リスティング モードは下位互換性のためにのみ維持されています。

より堅牢でカスタマイズ可能な出力については、findmnt を使用してください (8)、特にスクリプトで。

バッシュ関数:

#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

解決策 4:

このようなスクリプトは移植性がありません。 Unix の汚い秘密は、カーネルだけがどのファイルシステムがどこにあるかを知っているということです。/proc (移植可能ではない) のようなものを除けば、決して直接的な答えを与えることはありません.

私は通常 df を使用して、サブディレクトリのマウント ポイントが何であるか、およびそれがどのファイル システムにあるかを検出します。

たとえば (ash / AT&T ksh / bash / などの posix シェルが必要)

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

ちょっと有益な情報を教えてくれます。

解決策 5:

以下は、rsync バックアップ cron ジョブの 1 つで使用するものです。 /backup がマウントされているかどうかを確認し、マウントされていない場合はマウントを試みます (ドライブがホットスワップ ベイにあり、システムに存在しない可能性があるため、失敗する可能性があります)

注:以下は、/proc/mounts を grep するため、Linux でのみ機能します。より移植性の高いバージョンでは、'mount |マシューの答えのように、grep /backup'..

  if ! grep -q /backup /proc/mounts ; then
    if ! mount /backup ; then
      echo "failed"
      exit 1
    fi
  fi
  echo "suceeded."
  # do stuff here

Linux
  1. ソフトウェアがインストールされているかどうかを(スクリプトから)検出する最良の方法は?

  2. プロセス グループのすべてのメンバーにシグナルを送信する最良の方法は何ですか?

  3. Javaでメモリ不足の状態を処理する最良の方法は何ですか?

  1. Bashでの$#の使用は何ですか

  2. /bin を削除しました。回復する最良の方法は何ですか?

  3. 分割後にファイルを再度結合する最良の方法は何ですか?

  1. Bash Echoコマンドライン自体で実行されるコマンドライン(スクリプトではない)?

  2. echo バイナリを呼び出す最も安全で移植性の高い方法は何ですか?

  3. .bashrc で環境変数を設定する最良の方法は何ですか?