所以,这件事多年来一直困扰着我。
这种情况发生在更多的程序中,而不仅仅是 dd ,但我发现这种情况经常发生在涉及原始文件系统操作的程序中。
当我使用 dd 进行复制时——例如,通过执行 来制作可启动 USB 磁盘sudo dd if=somelinuxdistro.iso of=/dev/sdb bs=64K status=progress
,就像我的所有信号都被应用程序忽略了。(或者在 的情况下由内核SIGKILL
)htop
显示 status D
,这显然意味着“不间断睡眠”。如果出现硬件故障,它可能会保持这种状态很长时间,并且在常规使用中,我似乎找不到任何方法将其与终端分离,以便我可以继续工作 - 通常我最终只是切换到不同的终端完成我的工作。
我以前查过这个,但我从未找到关于此状态的用途或内核为何拒绝终止处于此状态的进程的解释,或者建议做什么以避免浪费时间。(也没有任何关于发生这种情况时该怎么做的建议。)
简而言之: 我想要一种可靠地强制终止处于 D 状态的进程的方法,或者至少将它们与终端分离。我还想解释一下背景中发生的事情导致他们首先处于这种状态。
理想情况下,我想要一种从 shell 脚本中检测窗口是否具有焦点的好方法。通过一个“好”的方式,我的意思是一些需要几个简单的步骤,最好不这样不要求通过每个打开的窗口筛选盲目寻矿基于标题。
目的是在许多不同的脚本中控制通知——所以我只是在寻找一个可以适用于所有脚本的通用解决方案。
到目前为止,我想出的是迂回曲折的——如下:
将我的标题设置为独特的或机械相关的(在我的模型中,它是我的 PTS 路径,或者更可靠的 UUID)。迫切希望这个标题不会被某些东西覆盖。
按标题获取所有打开窗口的列表。
遍历列表以通过将它与标题元素匹配来识别我的窗口。(请注意,如果另一个窗口碰巧具有相同的标题元素,则此处可能会出错。)
检测所述窗口是否具有焦点与否。
应当指出的是,我根本不想要实现这一点,只会做它作为最后的手段。所以我在这里要求的不是 this。
这个解决方案显然很糟糕,所以我想知道是否有更好的方法。我更喜欢便携、优雅和完美的东西,但我意识到可能需要妥协。通过更好地我的意思是下列任何:
一种仅适用于特定终端仿真器的解决方案,例如通过让终端仿真器本身设置一个环境变量,允许脚本检测它所在的窗口。
一种不需要设置标题的解决方案,而是在窗口状态中使用其他一些不可见标记,该标记可从附加到所述窗口的 shell 脚本中访问和检测。
重新使用父进程阶梯以查找父终端模拟器 PID,并从那里开始工作(请注意,通过重新使用进程树来检测启动脚本的父进程的解决方案仅在脚本在本地运行时才有效,所以这个解决方案不完整但仍然很好!)
我收到了关于我的首选解决方案应该在什么条件下运行的问题,答案是尽可能多。但至少,我想要一些有效的东西:
在本机运行的单选项卡终端会话中(默认方案)。
在像 tmux 这样的终端多路复用器中。(不同终端多路复用器之间的可移植性是首选,但实际上不是必需的。)
我非常欣赏的附加功能(按重要性排序)包括:
能够通过 telnet 和 SSH 进行远程连接。
能够区分哪个选项卡在多选项卡终端会话中打开。
我想要一个很好的方法来找到我的 shell 脚本附加到哪个终端仿真器窗口,以便我可以检测它是否有焦点。
请注意,我已经知道的力学如何通过打开的窗口进行迭代,以及如何检测自己是否有焦点或不和他们有什么头衔。我知道and 这个问题的存在xdotool
与xprop
这些工具的基本机制无关(除非有一些隐藏的黑魔法功能我不知道这会回避我当前解决方案的内在技巧。)
我不想那样做的原因是因为它太可怕了。即完成同样的事情没有其他解决办法?