如何强制换出的 zsh 进程换入?

zra*_*ajm 6 linux zsh

我的计算机上通常有许多长时间运行的 zsh 进程(分布在各个屏幕会话中),但一段时间未使用的 shell 往往会被替换掉。当我切换到这样一个换出的 shell 并按 Enter 键(在空提示符下)时,shell 需要很多秒才能响应并显示新的提示符(但之后它会恢复正常工作)。

\n\n

为了减少我的烦恼,我想要一个命令(例如unswap PID),我可以调用它(从另一个已经响应的 shell)来强制 shell 交换。

\n\n

关于如何实现这一目标有什么想法吗?

\n\n

PS我首先四处寻找命令来要求系统在任何进程 \xe2\x80\x93 中进行交换,但我没有发现这样的事情,让我相信这是不可能的。我在这里将我的问题集中在zsh,因为这是我真正感兴趣的情况,并且我希望针对该特定情况可能有解决方案。如果您有一个适用于任何进程(而不仅仅是 zsh)的更通用的方法,那也将非常受欢迎。

\n\n

PPS起初,我想到在 shell 中使用 trap 函数,然后它会执行一些足以导致 shell 交换的活动(任何事情)。WINCH但是,在使用信号尝试过此操作后,我发现它不起作用。(也许信号没有传递到换出的进程?有信号吗?)

\n\n
\n\n

编辑:在我的典型情况下,我有一堆zsh进程正在运行,然后我让浏览器打开(带有多个 Gmail、Facebook 等选项卡)太长时间,导致浏览器囤积所有可用 RAM 并挤压其他一切都进入交换。桌面有一段时间没有响应,但很快就会恢复正常。但是,当重新连接到屏幕会话时,必须手动唤醒每个 shell(遍历它们并在每个 shell 中按 Enter 键)。

\n

zra*_*ajm 2

正如这个答案中提到的,可以使用gdb转储进程的内存来取消交换它。

\n\n

我还发现这里有一个gcore脚本可以直接从命令行执行此操作(而不是首先启动gdb然后在其中执行其他命令),因此调用:

\n\n
gcore -o /tmp/SOMETHING PID1 PID2 PID3\n
Run Code Online (Sandbox Code Playgroud)\n\n

将导致 PID1、PID2 和 PID3 的程序取消交换,并将其内容转储到文件等/tmp/SOMETHING.PID1/tmp/SOMETHING.PID2

\n\n

这个答案中还有一个Python脚本可以做同样的事情。不过,不可否认 \xe2\x80\x93 作为对这个问题 \xe2\x80\x93 的回应,以一种更好的方式,因为这个脚本输出转储,STDOUT我们可以直接通过管道传送到地狱(嗯,我的意思/dev/null是,当然)因为我们只对取消交换的副作用感兴趣。

\n