daemontoolsのrunファイルで、exec COMMANDじゃなくてshを介してexec sh -c 'exec COMMAND'する理由
だいぶ昔になんでかなーなんでだろーなーと思ったこと:
dnscache-confで作ったrunファイルが、
#!/bin/sh exec 2>&1 exec <seed exec envdir ./env \ envuidgid dnscache softlimit -o250 -d "$DATALIMIT" /usr/local/bin/dnscache
じゃなくて、こんなふうに、
#!/bin/sh exec 2>&1 exec <seed exec envdir ./env sh -c ' exec envuidgid dnscache softlimit -o250 -d "$DATALIMIT" /usr/local/bin/dnscache '
わざわざshをexecして、そのshのなかでお目当てのプログラムを起動してたこと。
で、今日、某IRCチャンネルみてて気がついたんですが、これって
echo 2000000 > env/DATALIMIT
みたいに外部ファイルで設定値変更するためだったんすね。
exec \ envdir ./env \ softlimit -d "$DATALIMIT" \ COMMAND
だと、"$DATALIMIT" は env/DATALIMIT の値に展開されないけど、
exec \ envdir ./env \ sh -c ' exec \ softlimit -d "$DATALIMIT" \ COMMAND '
なら、envdir ./envによって、$DATALIMIT がセットされたシェルの中で "$DATALIMIT" が評価されるからちゃんと展開されるという。
というわけで、
#!/bin/sh # to change VIRTSIZE # echo $((768*1024*1024)) > env/VIRTSIZE exec 2>&1 exec \ envdir ./env \ sh -c 'exec \ setuidgid hirose31 \ env - PATH=$PATH:/command \ softlimit -a ${VIRTSIZE:-$((512*1024*1024))} \ ./do \ '
な run ファイルが書けるようになってご満悦です。