スクリプトを使用してディスク イメージをアンマウントする際に問題が発生します...ただし、手動では発生しません。

スクリプトを使用してディスク イメージをアンマウントする際に問題が発生します...ただし、手動では発生しません。

シェル スクリプトを書くのは初めての経験ですが、奇妙なことが起こっています。私は組み込みシステムで作業しており、ゲスト システムの /root フォルダーにスクリプト test5.sh を配置して、eMMC カード イメージの最初のパーティションをマウントし、テストを実行し、test1 によって作成されたファイルを削除し、カードにアクセスしているプロセスを強制終了し (リソースがビジーになるのを避けるため、私の場合、fuser コマンドからのプロセスは常に 1 つだけです)、最後にカード自体をアンマウントしたいと考えていました。私が書いたのは次のようなものです。

#!/bin/sh

cd ../dev
e2fsck mmcblk0p1
mount -t auto mmcblk0p1 ../mnt
cd ../mnt
./../bin/test1
rm file*
variable=$(fuser -m /mnt)
echo $variable
kill -9 $variable
echo "Before the problem"
umount /mnt
echo "After the problem"

問題は、ターミナル出力から確認できるように、最後の umount コマンドが実行されないことです。

# ./test5.sh 
e2fsck 1.42.12 (29-Aug-2014)
mmcblk0p1: clean, 11/117360 files, 7386/468990 blocks
STARTED
random: nonblocking pool is initialized
ENDED
647
Killed
# mount
[...]
mmcblk0p1 on /mnt type ext2 (rw,relatime,errors=continue)

この時点で、スクリプトの最後のコマンドを手動で送信すると、次のようになります。

umount /mnt

操作は正常に完了しました [マウントで確認しました]。スクリプトの最後の行が「非表示」になっているのはなぜですか? 欠落しているポイントが見つかりません。この問題を修正するにはどうすればよいですか?

協力してくれる方々に感謝します


編集


umount /command が実行されないのは、強制終了したプロセスが原因であると考え始めています。手動で実行する場合:

lsof /mnt

fuser -m /mnt [640 のみを返す] の代わりに詳細な出力を得るには、出力は次のようになります。

# lsof /mnt
1   /bin/busybox    /dev/console
1   /bin/busybox    /dev/console
1   /bin/busybox    /dev/console
624 /bin/busybox    /dev/null
624 /bin/busybox    /dev/null
624 /bin/busybox    /dev/null
624 /bin/busybox    socket:[747]
624 /bin/busybox    /tmp/messages
625 /bin/busybox    /dev/null
625 /bin/busybox    /dev/null
625 /bin/busybox    /dev/null
625 /bin/busybox    socket:[751]
640 /bin/busybox    /dev/ttyAMA0
640 /bin/busybox    /dev/ttyAMA0
640 /bin/busybox    /dev/ttyAMA0
640 /bin/busybox    /dev/tty

私の考えでは、pid 640 [リソースをビジー状態にするプロセス、ttyAMA0 は組み込みシステムのシリアルポート] のプロセスを強制終了すると、スクリプトの残りの部分も終了する [最後の 2 つの echo 行もスキップされます]。また、手動で強制終了行を実行する場合は再度ログインする必要がありますが、スクリプトを起動する場合はこの問題が発生しません。原因と修正方法がわかれば幸いです。

答え1

スクリプトには、現在の作業ディレクトリがデバイスがマウントされている場所と同じであることを意味する内容が含まれているため、スクリプトの実行中にデバイスがアンマウントされません cd ../mnt。したがって、スクリプトを次のように変更します。

#!/bin/sh

cd ../dev
e2fsck mmcblk0p1
mount -t auto mmcblk0p1 ../mnt
cd ../mnt
./../bin/test1
rm file*
variable=$(fuser -m /mnt)
echo $variable
kill -9 $variable
cd ~
sudo umount -f /mnt

関連情報