# fork [![crates.io](https://img.shields.io/crates/v/fork.svg)](https://crates.io/crates/fork) [![Build](https://github.com/immortal/fork/actions/workflows/build.yml/badge.svg)](https://github.com/immortal/fork/actions/workflows/build.yml) [![codecov](https://codecov.io/gh/immortal/fork/graph/badge.svg?token=LHZW56OC10)](https://codecov.io/gh/immortal/fork) [![docs](https://docs.rs/fork/badge.svg)](https://docs.rs/fork) Library for creating a new process detached from the controlling terminal (daemon). ## Why? - Minimal library to daemonize, fork, double-fork a process. - [daemon(3)](https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/daemon.3.html) 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` ```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: ```pre 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