我正在编写一个bash脚本,在SD卡上将我的rootfs更改为另一个。
这些步骤大致如下:
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 /旧-root.
这在儿子自杀、杀死父母的过程中行不通,我觉得这个解决方案有点肮脏。
所以我的问题是:
我真的想尽量减少人与人之间的交互,所以调用一个脚本,等待它完成启动另一个脚本是一个拒绝,除非没有其他的解决方案。
发布于 2016-09-01 08:46:27
但“父”脚本中的最后一个命令将其替换为“子”。这就是exec所做的。您不应该有任何可以杀死的父进程。
只有当脚本为PID 1时,这样的脚本才能工作,这样就没有其他进程*。您一定是用init=/bin/bash启动的。记住使用exec调用脚本,这样它就可以代替PID 1。
不要使用延迟卸载,这意味着您将不会看到错误消息。
我有99%的信心你懒散的坐骑还没完成。我不知道如何测试这一点,除了使用ext4或ext3之外,file -s /dev/$ROOT_DEV应该显示“需要日志恢复”(即没有干净地卸载)。
如果您删除kill并遵循上面粗体的说明,我希望您的第一次尝试能够奏效。不过,我可能漏掉了什么。
*或者,您需要告诉init重新执行它自己,在安排了它的exec在目标文件系统上的路径之后。但对我来说这听起来是个糟糕的主意。简单点就行了。
https://unix.stackexchange.com/questions/306993
复制相似问题