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

fork

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

25 releases

new 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

#40 in Operating systems

Download history 11965/week @ 2024-04-04 10080/week @ 2024-04-11 14071/week @ 2024-04-18 16007/week @ 2024-04-25 12454/week @ 2024-05-02 16901/week @ 2024-05-09 21187/week @ 2024-05-16 14866/week @ 2024-05-23 13189/week @ 2024-05-30 11710/week @ 2024-06-06 11810/week @ 2024-06-13 17993/week @ 2024-06-20 10773/week @ 2024-06-27 10712/week @ 2024-07-04 14025/week @ 2024-07-11 13519/week @ 2024-07-18

57,233 downloads per month
Used in 27 crates (26 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