如何在Linux中拦截Exec调用?

时间:2016-11-01 14:21:51

标签: linux exec

tl; dr:我希望用一些检查Caps Lock的东西包装所有应用程序执行,并根据其状态,让应用程序正常通过,或将可执行文件(及其env和args)传递给另一个应用程序。

长篇故事:我有一台Optimus笔记本电脑,想要一个简单的方法,从UX的角度来看,涉及的工作量最少,告诉应用程序使用英特尔图形或Nvidia GPU。

我实际上有一个(非常粗略的)工作原型:

#!/bin/bash
if [[ -z `xset q | grep -o 'Caps Lock:   on'` ]]; then
    notify-send -u low -t 5000 -a 'Steam' -i 'steam' -c game 'Steam' 'GPU: intel'
    steam
else
    notify-send -u low -t 5000 -a 'Steam' -i 'steam' -c game 'Steam' 'GPU: nvidia'
    primusrun steam
fi

但是,即使我通过使用$0,符号链接和其他有趣的shell魔术来概括这一点,这对于所有场景都不够。有些应用程序似乎以阻止primusrun(以及它在env中放置的内容)的方式进行分支,以跟踪整个执行链。我目前通过执行shell primusrun xfce4-terminal来解决这个问题,然后从那里执行这些应用程序。 (尽管如此,当应用程序使用守护程序进程执行应用程序时,就会失败,这与我正在执行的任何内容分开。在这些情况下,我必须使用primusrun重新启动这些守护程序。我真的不喜欢这样做。)

如果我在没有帮助的情况下这样做,我会使用LD_PRELOAD劫持对exec *的低级调用以注入我的包装器。对于聪明的人可能知道的更好的做法,这听起来像很多工作。 ;)

0 个答案:

没有答案