Generically, this is a well answered question. Linux doesn't allow non-privileged users to lower a PID's niceness, and running things as root is its own can of worms.
That said, here are my specifics: I've got a user account that manages a few processes which has passwordless sudo
privileges for renice
and a few other commands it uses. I also have a script that is the common entry point for all users on this system. This script can both run regular user programs as well as the processes managed by the special account. So the script, when run with a specific option, should renice
if it can, but fail silently at the if it cannot.
The code I've got for this looks like:
subprocess.Popen(["sudo", "renice", "-20", str(process.pid)],
# shell = True,
stdout = subprocess.DEVNULL,
stderr = subprocess.STDOUT)
If I have shell = True
commented out, the process gets its new niceness, but if I'm running as an unprivileged user, sudo
kicks out its password prompt and wrecks my terminal output. Keystrokes become invisible and everything gets stupid looking. If I uncomment shell = True
, I get no terminal output. However, the process doesn't get its niceness changed, even if I run it as root.
The corrupted terminal output may well be down to the terminal emulator I'm using (haven't tried it with another one) but I want to merge these behaviors. Silence from sudo
no matter what, but a niceness change if the user can sudo successfully.
Any pointers?