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

时间:2013-08-03 06:18:29

标签: linux zsh

我的计算机上通常有许多长时间运行的zsh进程(分散在各种屏幕会话中),但是暂时没有使用的shell往往会被换出。当我切换到这样一个换出的shell并按下回车键(在空提示符下)时,它会在shell响应并显示一个新提示之前花费很多秒(但之后它会恢复正常工作)。

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

关于如何实现这一目标的任何想法?

PS 我开始寻找一个命令让系统交换任何进程 - 但我发现没有这样的事情,让我相信这个不可能。我在这里把我的问题集中在zsh上,因为这是我真正感兴趣的情况,我希望可能有一个特定案例的解决方案。如果你有一个更通用的方法可以适用于任何进程(而不仅仅是zsh),那也非常受欢迎。

PPS 起初我想在我的shell中使用一个陷阱函数,然后做一些活动(任何事情)足以让shell交换。用{{1}尝试了这个但是,我发现它不起作用。 (也许信号不会传递给换出的过程?是否有信号?)


编辑:在我的典型情况下,我有一堆WINCH进程正在运行,然后我将浏览器打开(有多个Gmail,Facebook等标签)太长时间,导致浏览器囤积所有可用的RAM并其他所有内容挤出到交换中。桌面没有响应一段时间,但很快就有点清除了。但是,当重新连接到屏幕会话时,必须手动唤醒每个shell(通过它们并在每个shell中按Enter键)。

2 个答案:

答案 0 :(得分:2)

正如this answer中所提到的那样,可以使用gdb来转储进程的内存以使其无法被删除。

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

gcore -o /tmp/SOMETHING PID1 PID2 PID3

将导致具有PID1,PID2和PID3的程序变为未通过,并将其内容转储到文件/tmp/SOMETHING.PID1/tmp/SOMETHING.PID2等。

this answer中还有一个Python脚本可以做同样的事情。但是,诚然 - 作为对这个问题的回答 - 以更好的方式,因为这个脚本在STDOUT输出转储,我们可以直接进入地狱(嗯,我的意思是/dev/null,当然)因为我们只对未加电的副作用感兴趣。

答案 1 :(得分:0)

您是否尝试过/可以减少内核swappiness值,以便zsh不太可能被换出?

如果您愿意重新编译zsh,可以在main()中插入对mlockall(MCL_CURRENT | MCL_FUTURE)的调用。这可以防止它首先被换掉。

或添加一个信号处理程序,调用mlockall(MCL_CURRENT)后跟munlockall()。