initスクリプト内でdaemon起動する場合、大抵/etc/rc.d/init.d/functions
で定義されるdaemon関数を呼び出すようになっている。たとえばredisやhttpdだと以下のようになっている。
$ grep '^[^#].*daemon' /etc/init.d/redis
daemon --user ${REDIS_USER-redis} "$exec $REDIS_CONFIG --daemonize yes --pidfile $pidfile"
$ grep '^[^#].*daemon' /etc/init.d/httpd
LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
daemon関数を確認するとniceに関する記述がある。
$ grep NICE /etc/rc.d/init.d/functions
# if they set NICELEVEL in /etc/sysconfig/foo, honor it
[ -n "${NICELEVEL:-}" ] && nice="nice -n $NICELEVEL"
/etc/sysconfig/fooでNICELEVELをセットすればいいと書いてあるので、redisであれば/etc/sysconfig/redisに以下のように書けばよい。
NICELEVEL=-10
psで確認するとNIが-10になっていることがわかる。
$ sudo service redis restart
$ ps lax | { head -1; grep redi[s]; }
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
1 495 30527 1 15 -10 184432 19224 ep_pol S<sl ? 290:51 /usr/bin/redis-server *:6379
$ ps -U redis -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
1 S 495 30527 1 1 75 -10 - 46108 ep_pol ? 04:50:51 redis-server
稼働中でrestartできないのであれば、reniceを使う。
$ sudo renice -n -10 対象のPID
redisであれば次のように実行すれば、PIDを取得したうえでそのPIDに対してreniceしてくれる。
$ ps -o pid= -U redis | xargs -I% sudo renice -n -10 -p %