Process tracking in Upstart
Recently, I exprienced a problem with the process tracking in Upstart:
I wanted start a daemon process running as a specific user. However, I needed root privileges in the pre-start
script, so I could not use the setuid
/setgid
options. I tried to use su
in the exec option, but then Upstart would not track the right process. The expect fork
and expect daemon
options did not help either. As a nasty side effect, these options cannot be tested easily, because having the wrong option will lead to Upstart waiting for an already dead process to die and there is no way to reset the status in Upstart. At least, there is a workaround for effectively resetting the status without restarting the whole computer.
The problem is that su
forks when running the command it is asked to run instead of calling exec
from the main process. Unfortunately, The process I had to run would fork again because I had to run it as a daemon (not running it as a daemon had some undesirable side effects). Finally, I found the solution: Instead of using su
, start-stop-daemon
can be used. This tool will not fork and therefore it will not upset Upstart's process tracking. For example, the line
exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmdwill run /bin/server_cmd as daemonuser without forking.
This way, expect fork
or expect daemon
can be used, just depending on the fork behavior of the final process.