【问题标题】:syncing a shell script with kernel operations将 shell 脚本与内核操作同步
【发布时间】:2011-04-06 23:49:54
【问题描述】:

为了在我的嵌入式 Linux 系统中停止活动,我有以下 shell 脚本(由 bu​​sybox 解释):

#!/bin/sh
pkill usefulp_program
swapoff /home/.swapfile
umount -l /home
sleep 3 # While I can't find a way to sync, sleep

如果我取消sleep 行,脚本会立即返回,甚至不需要等待umount(这是懒惰的,因为某些原因它拒绝卸载)。你知道我怎样才能在完成脚本之前等待所有三个操作完成吗?诉诸任意的sleep 看起来不是一个好的解决方案。

另外,关于为什么我不能在没有-l 的情况下不能umount 的任何提示?

【问题讨论】:

  • 您是否尝试将umount-f(强制)或-n(不要写入/etc/mtab)标志一起使用?
  • umount 需要惰性可能意味着某些文件或目录已打开;如果您安装了procfs,请尝试:ls -ld /proc/*/cwd /proc/*/fd/*| grep home 以查看是否有任何进程在/home/ 中具有当前工作目录或在/home 中打开文件。
  • 仔细观察,需要 -l 似乎是不等待进程终止的结果,因为它使用 /home。
  • 当任何进程在挂载点下打开了任何文件,或者进程将其当前目录作为挂载点或挂载点下的目录时,您无法卸载文件系统。如果正如您的评论所暗示的那样,您正在运行的脚本位于/home 下,那么您就是在躲藏起来;你不能卸载/home,直到它的所有文件都没有被使用,并且在脚本运行时文件正在使用中。您必须将脚本从 /home 文件系统中移出。
  • 脚本在 /home 之外。唯一使用 /home 的进程是我要杀死的进程。

标签: linux shell embedded busybox


【解决方案1】:

您需要等待被杀死的进程终止。根据您的评论...

wait <pid>

...不起作用!所以,可以循环ala:

while ps -p <pid> > /dev/null; do sleep 1; done

在执行 swapoff 和 umount 之前等待被杀死的进程终止。

【讨论】:

  • 等待似乎只对子进程有效,这里不是这样。
  • @lvella:感谢您的澄清......然后手册页具有误导性(说“等待每个指定的进程并返回其终止状态。每个 n 可能是进程 ID 或作业规范”,只在没有给出参数的情况下继续提及子进程)。
【解决方案2】:

正如其他人已经提到的那样,您应该并且只有在进程终止时才使用-l。如果需要很长时间/它只是忽略您停止自身的礼貌请求,则一个选项是使用不同的信号。选项将是-9 到 kill/killall/pkill 命令以发送 SIGKILL 而不是 SIGTERM。如果您不想在第一次尝试时使用锤子,您可以这样做

pkill your_programm
sleep 10
pkill -9 your_programm

【讨论】:

  • 顺便说一句,这是桌面 linux 在关机时所做的。此外,您可能想尝试以只读方式重新挂载文件系统,而不是完全卸载它。
猜你喜欢
  • 2010-12-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多