【问题标题】:Start a process (using Runtime.exec / ProcessBuilder.start) with low priority以低优先级启动进程(使用 Runtime.exec / ProcessBuilder.start)
【发布时间】:2012-02-21 15:22:48
【问题描述】:

我需要以低优先级启动 CPU 密集型系统进程,以免降低我的服务器速度。如何在 Linux 上做到这一点?

这类似于这个问题:Start a Java process at low priority using Runtime.exec / ProcessBuilder.start? 除了在 Linux 而不是 Windows 上。如果在进程启动后改变进程的优先级是可以的(只要没有太多延迟)。

【问题讨论】:

    标签: java linux scheduling processbuilder


    【解决方案1】:

    使用/usr/bin/nice 运行命令。例如:

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

    将以+10 的精度运行somecommand arg1 arg2。 (在 Unix / Linux 中,较大的 niceness 值会导致较低的调度程序优先级。nice 的范围通常是从 -19 到 +19。)

    请注意,此解决方案是特定于平台的。它只适用于 Linux 和 Unix 系统...


    跟进

    ProcessBuilder 应该像任何普通命令一样被实例化;即

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

    关于何时/如何拆分命令/参数没有什么黑魔法。命令(例如nice)语法决定了它的参数应该是什么,这决定了它们应该如何在shell命令行中引用,以及在使用ProcessBuilder(或本机exec*系统调用时应该如何提供它们)那件事)。

    我不认为waitFor() 等应该有问题,因为(AFAIK)/usr/bin/nice 命令使用exec(不是fork / exec)来运行提供的命令。试试看...

    【讨论】:

    • 我应该如何将它传递给 ProcessBuilder? new ProcessBuilder("nice", "-n", "10", "somecommand", "arg1", "arg2") 或 new ProcessBuilder("nice", "-n", "10", "somecommand arg1 arg2" )?会不会出现 Windows 解决方案出现的 waitfor() 和 destroy() 问题?
    猜你喜欢
    • 2011-09-07
    • 2018-04-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多