#daemon-process #process #daemon #daemonize #setsid

fork

Library for creating a new process detached from the controlling terminal (daemon)

25 releases

0.2.0 Jul 19, 2024
0.1.23 Feb 1, 2024
0.1.22 Jun 6, 2023
0.1.21 Mar 12, 2023
0.1.9 Oct 28, 2019

#69 in Operating systems

Download history 16290/week @ 2024-08-15 25938/week @ 2024-08-22 20636/week @ 2024-08-29 28514/week @ 2024-09-05 20079/week @ 2024-09-12 22843/week @ 2024-09-19 31158/week @ 2024-09-26 18951/week @ 2024-10-03 22843/week @ 2024-10-10 21517/week @ 2024-10-17 18550/week @ 2024-10-24 17459/week @ 2024-10-31 15073/week @ 2024-11-07 52533/week @ 2024-11-14 17973/week @ 2024-11-21 15671/week @ 2024-11-28

103,441 downloads per month
Used in 29 crates (27 directly)

BSD-3-Clause

11KB
81 lines

fork

crates.io Build codecov docs

Library for creating a new process detached from the controlling terminal (daemon).

Why?

  • Minimal library to daemonize, fork, double-fork a process.
  • daemon(3) has been deprecated in MacOSX 10.5, by using fork and setsid syscalls, new methods can be created to achieve the same goal.

Example:

Create a new test project:

$ cargo new --bin myapp

To install cargo use: curl https://sh.rustup.rs -sSf | sh

Add fork as a depdendecie:

cargo add fork

or Edit myapp/Cargo.toml and add to [dependencies]:

fork = "0.1"

Add the following code to myapp/main.rs

use fork::{daemon, Fork};
use std::process::Command;

fn main() {
    if let Ok(Fork::Child) = daemon(false, false) {
        Command::new("sleep")
            .arg("300")
            .output()
            .expect("failed to execute process");
    }
}

If using daemon(false, false),it will chdir to / and close the standard input, standard output, and standard error file descriptors.

Test running:

$ cargo run

Use ps to check the process, for example:

$ ps -axo ppid,pid,pgid,sess,tty,tpgid,stat,uid,%mem,%cpu,command, | egrep "myapp|sleep|PID"

egrep is used to show the ps headers

Output should be something like:

 PPID   PID  PGID   SESS TTY      TPGID STAT   UID       %MEM  %CPU COMMAND
    1 48738 48737      0 ??           0 S      501        0.0   0.0 target/debug/myapp
48738 48753 48737      0 ??           0 S      501        0.0   0.0 sleep 300
  • PPID == 1 that's the parent process

  • TTY = ?? no controlling terminal

  • new PGID = 48737

    1 - root (init/launchd)
     \-- 48738 myapp        PGID - 48737
      \--- 48753 sleep      PGID - 48737
    

Dependencies

~43KB