Start a process (using Runtime.exec / ProcessBuilder.start) with low priority

為{幸葍}努か 提交于 2019-12-10 15:32:23

问题


I need to start a CPU-intensive system process under low priority so that it doesn't slow down my server. How can I do this on Linux?

This is similar to this question: Start a Java process at low priority using Runtime.exec / ProcessBuilder.start? except on Linux instead of Windows. It's OK if the process's priority is changed after the process is started (as long as there isn't much delay).


回答1:


Run the command using /usr/bin/nice. For instance:

$ /usr/bin/nice -n 10 somecommand arg1 arg2

will run somecommand arg1 arg2 at a niceness of +10. (In Unix / Linux, a larger niceness value results in a lower scheduler priority. The range of nice is typically from -19 to +19.)

Note that this solution is platform specific. It will only work on Linux and Unix systems ...


FOLLOW UP

The ProcessBuilder should be instantiated as you would any normal command; i.e.

    new ProcessBuilder("nice", "-n", "10", "somecommand", "arg1", "arg2");

There's no black magic about when / how to split commands / arguments. The command (e.g. nice) syntax determines what it arguments should be, and that determines both how they should quoted on the shell command line, and how they should be provided when using ProcessBuilder (or the native exec* syscalls of that matter).

I don't think that there should be problems with waitFor() etc, because (AFAIK) the /usr/bin/nice command uses exec (not fork / exec) to run the supplied command. Try it out ...



来源:https://stackoverflow.com/questions/9053600/start-a-process-using-runtime-exec-processbuilder-start-with-low-priority

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!