一般而言,这是一个已经得到很好回答的问题。Linux不允许非特权用户降低PID的niceness值,而以root权限运行则会带来一些新的问题。
尽管如此,下面是我的具体解决方案:我有一个用户帐户来管理一些进程,该帐户拥有对renice等几个命令的无密码sudo权限。我还有一个脚本,是所有用户在该系统上的通用入口点。该脚本既可以运行常规用户程序,也可以运行由特殊帐户管理的进程。因此,当以特定选项运行脚本时,如果可以,应该进行renice操作,但如果不能,则保持静默。
我使用的代码如下:
如果
损坏的终端输出可能是由于我使用的终端仿真器(尚未尝试其他仿真器)所致,但我希望合并这些行为。无论如何,
有任何建议吗?
尽管如此,下面是我的具体解决方案:我有一个用户帐户来管理一些进程,该帐户拥有对renice等几个命令的无密码sudo权限。我还有一个脚本,是所有用户在该系统上的通用入口点。该脚本既可以运行常规用户程序,也可以运行由特殊帐户管理的进程。因此,当以特定选项运行脚本时,如果可以,应该进行renice操作,但如果不能,则保持静默。
我使用的代码如下:
subprocess.Popen(["sudo", "renice", "-20", str(process.pid)],
# shell = True,
stdout = subprocess.DEVNULL,
stderr = subprocess.STDOUT)
如果
shell = True
被注释掉,该进程将获得新的niceness值。但如果我以非特权用户身份运行,则sudo
会提示输入密码并破坏我的终端输出。按键变得不可见,一切看起来都很愚蠢。如果我取消注释shell = True
,则不会在终端输出任何内容,但是即使作为root用户运行该进程也不会改变其niceness值。损坏的终端输出可能是由于我使用的终端仿真器(尚未尝试其他仿真器)所致,但我希望合并这些行为。无论如何,
sudo
都没有响应,但如果用户可以成功使用sudo,则更改niceness值。有任何建议吗?
Popen
中添加start_new_session=True
会导致非特权用户无声地失败,而以root身份成功,因此我想它也适用于我的无密码sudo
用户。太好了。如果您希望我接受答案,请随意发布。=) - pdm