shell脚本控制——调整谦让度

在多任务操作系统(比如Linux)中,内核负责为每个运行的进程分配CPU时间。调度优先级【也称为谦让度(nice value)】是指内核为进程分配的CPU时间(相对于其他进程)。在Linux系统中,由shell启动的所有进程的调度优先级默认都是相同的。

调度优先级是一个整数值,取值范围从-20(最高优先级)到+19(最低优先级)。在默认情况下,bash shell以优先级0来启动所有进程。

提示        -20(最低值)代表最高优先级,+19(最高值)代表最低优先级,这很容易记混。只要记住那句俗语“好人难做”(Nice guys finish last.)即可。越是“谦让”(nice)或是值越大,获得CPU的机会就越低。

有时候,你想改变shell脚本的调度优先级。不管是降低优先级(这样就不会从其他进程那里抢走过多的CPU时间) ,还是提高优先级(这样就能获得更多的CPU时间),都可以通过nice命令来实现。

1.nice命令

nice命令允许在启动命令时设置其调度优先级。要想让命令以更低的优先级运行,只需用nice命令的-n选项指定新的优先级即可:

$ nice -n 10 ./jobcontrol.sh > jobcontrol.out &
[2] 16462
$
$ ps -p 16462 -o pid,ppid,ni,cmd
    PID    PPID  NI  CMD
  16462    1630  10  /bin/bash ./jobcontrol.sh
$

注意,nice命令和要启动的命令必须出现在同一行中。ps命令的输出证实,谦让度(NI列)已经调整到了10.

nice命令使得脚本以更低的优先级运行。但如果想提高某个命令的优先级,那么结果可能会让你大吃一惊:

$ nice -n -5 ./jobcontrol.sh > jobcontrol.out &
[2] 16473
$ nice: cannot set niceness: Permission denied

$ ps -p 16473 -o pid,ppid,ni,cmd
    PID    PPID  NI  CMD
  16473    1630   0  /bin/bash ./jobcontrol.sh
$

nice命令会阻止普通用户提高命令的优先级。注意,即便提高其优先级的操作没有成功,指定的命令依然可以运行。只有root或者特权用户才能提高作业的优先级。

nice命令的-n选项并不是必需的,直接在连字符后面跟上优先级也可以:

$ nice -10 ./jobcontrol.sh > jobcontrol.out &
[2] 16520
$
$ ps -p 16520 -o pid,ppid,ni,cmd
    PID    PPID  NI  CMD
  16520    1630  10  /bin/bash ./jobcontrol.sh
$

然而,当要设置的优先级是负数时,这种写法则很容易造成混淆,因为出现了双连字符。在这种情况下,最好还是使用-n选项。

2.renice命令

有时候,你想修改系统中已运行命令的优先级。renice命令可以帮你搞定。它通过指定运行进程的PID来改变其优先级:

$ ./jobcontrol.sh > jobcontrol.out &
[2] 16642
$
$ ps -p 16642 -o pid,ppid,ni,cmd
    PID    PPID  NI  CMD
  16642    1630   0  /bin/bash ./jobcontrol.sh
$
$ renice -n 10 -p 16642
16642 (process ID) old priority 0, new priority 10
$
$ ps -p 16642 -o pid,ppid,ni,cmd
    PID    PPID  NI  CMD
  16642    1630  10  /bin/bash ./jobcontrol.sh
$

renice命令会自动更新运行进程的调度优先级。和nice命令一样,renice命令对于非特权用户也有一些限制:只能对属主为自己的进程使用renice且只能降低调度优先级。但是,root用户和特权用户可以使用renice命令对任意进程的优先级做任意调整。

你可能感兴趣的:(bash,linux)