[erlang-questions] managing OS processes

Garrett Smith g@REDACTED
Tue May 29 19:15:00 CEST 2012


On Sat, May 26, 2012 at 4:06 AM, Benoit Chesneau <bchesneau@REDACTED> wrote:
> I'm trying to find a way to manage some os processes launched from
> Erlang. For example I need to relaunch them when the external process
> die for an unknown reason or send an HUP signal or just stop the
> external process.
>
> For now I'm using erlang ports to open an external process and detect
> when it die. I also send signals using the `os:cmd` and and always
> send a SIGKILL signal using the `os:cmd`before closing the port. But
> is there a better way to do that? Maybe a module somewhere ? I saw
> erlexec [1] but it doesn't seem to be maintained since a while.

I think it'd be great to get this into OTP core, but until that
functionality is a) implemented and b) has demonstrated solid
operations across range of platforms, I'm inclined to use something
like runit.

http://smarden.org/runit

Runit will "daemonize" for you (wants child processes to run in the
foreground) and provides a simple interface for sending signals to a
child process. E.g. to send KILL to a process (shell example):

printf k > $SERVICE/supervise/control

The control scheme is described here:

http://smarden.org/runit/runsv.8.html

It's not as tightly integrated as a futuristic open_port might be.
E.g. if you want to detect a pathological case (service flapping, app
errors, etc.) you'd have to poll the environment (track pid changes,
scan logs, etc.) But there are sometimes advantages to keeping OS
process supervision and monitoring at arms length.

Garrett



More information about the erlang-questions mailing list