私のrootfsをSDカードの他のrootfsに変更するためのbashスクリプトを書いています。
ステップはおおよそ次のとおりです。
mount /dev/hda1 /new-root
cd /new-root
pivot_root . old-root
exec chroot . sh <dev/console >dev/console 2>&1
umount /old-root
これは対話型モードでは期待どおりに機能しますが、インタプリタが実行中で削除できold-root
ないため、スクリプトでは機能しません。
だから、私は次のように親を殺す中間スクリプトを試しました。
# parent
exec chroot sd_card_fs sh -c script.sh
# son
cat script.sh
...
kill -9 $PPID
umount /old-root
...
息子が自殺して彼の両親を殺したので、この方法はうまくいきませんでした。そして私はこの解決策が少し汚れていると思います。
だから私の質問は次のようになります
- タスクを実行するために他のスクリプトを呼び出すよりもきちんとした方法はありますか?そうでなければ、どのように解決できますか?
私はできるだけ人間の相互作用を減らしたいと思います。したがって、他の解決策がない限り、1つのスクリプトを呼び出して別のスクリプトの実行が完了するのを待つことは機能しません。
答え1
しかし、「親」スクリプトの最後のコマンドは変える「息子」と一緒に。それだけですexec
。終了できる親プロセスがあってはなりません。
これらのスクリプトは次のことができます。ただスクリプトのPIDが1のときに機能するため、他のプロセスはありません[*]。 有効にする必要があります。init=/bin/bash
。 以下を使用してスクリプトを呼び出すことを忘れないでください。exec
そのため、PID 1を置き換えます。
遅延除去を使用しないでください。つまり、エラーメッセージは表示されません。
あなたの怠惰な除去作業がまだ完了していないと99%確信しています。 ext4またはext3を使用しない限り、これをテストする方法がわかりません。file -s /dev/$ROOT_DEV
「ログ回復が必要」(つまり、まだ完全に削除されていない)とマークする必要があります。
kill
上記の太字の指示を削除して従うと、最初の試みが成功することを願っています。それでも何かを逃したかもしれません。
[*]またはターゲットファイルシステムで実行パスをソートした後、initにそれ自身を再度実行するように指示する必要があります。しかし、これは私にとって悪い考えのように聞こえます。仕事を単純にしてください。