Skip to content
Execute and control OS processes from Erlang/OTP
Branch: master
Clone or download
saleyn Merge pull request #123 from Darkkey/master
Fixed extra warn when portexec isn't in priv(#122)
Latest commit bff7c62 Mar 14, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
c_src Merge branch 'master' of Jan 21, 2019
include Make backward compatible with OTP-20 and less Aug 7, 2018
src Update exec.erl Mar 14, 2019
test Fix test case running 300 processes Nov 17, 2016
.gitignore Add build optimization option via OPTIMIZE env var Nov 17, 2016
.travis.yml Remove osx from Travis Nov 16, 2016
AUTHORS Add support for rebar3 and hex Dec 9, 2015
LICENSE Moved project from and ported from autotools to rebar. Sep 29, 2012
Makefile version bump Nov 17, 2016
rebar.config Add test_exec.erl that executes many tasks Nov 16, 2016


Build Status

Execute and control OS processes from Erlang/OTP.

This project implements an Erlang application with a C++ port program that gives light-weight Erlang processes fine-grain control over execution of OS processes.

The following features are supported:

  • Start/stop OS commands and get their OS process IDs, and termination reason (exit code, signal number, core dump status).
  • Manage/monitor externally started OS processes.
  • Execute OS processes synchronously and asynchronously.
  • Set OS command's working directory, environment, process group, effective user, process priority.
  • Provide custom termination command for killing a process or relying on default SIGTERM/SIGKILL behavior.
  • Specify custom timeout for SIGKILL after the termination command or SIGTERM was executed and the running OS child process is still alive.
  • Link an Erlang processes to OS processes (via intermediate Erlang Pids that are linked to an associated OS process).
  • Monitor termination of OS processes.
  • Terminate all processes beloging to an OS process group.
  • Kill processes belonging to an OS process group at process exit.
  • Communicate with an OS process via its STDIN.
  • Redirect STDOUT and STDERR of an OS process to a file, erlang process, or a custom function. When redirected to a file, the file can be open in append/truncate mode, and given creation access mask.
  • Run interactive processes with psudo-terminal pty support.
  • Execute OS processes under different user credentials (using Linux capabilities).
  • Perform proper cleanup of OS child processes at port program termination time.

This application provides significantly better control over OS processes than built-in erlang:open_port/2 command with a {spawn, Command} option, and performs proper OS child process cleanup when the emulator exits.

See for more information.


Linux, Solaris, FreeBSD, MacOS X




Make sure you have rebar ( or installed locally and the rebar script is in the path.

If you are deploying the application on Linux and would like to take advantage of exec-port running tasks using effective user IDs different from the real user ID that started exec-port, then make sure that libcap-dev[el] library is installed.

OS-specific libcap-dev installation instructions:

  • Fedora, CentOS: "yum install libcap-devel"
  • Ubuntu: "apt-get install libcap-dev"
$ git clone
$ make

# NOTE: for enabling optimized build of exec-port, do the following instead:
$ OPTIMIZE=true make


The program is distributed under BSD license. Copyright (c) 2003 Serge Aleynikov

You can’t perform that action at this time.