Crates.io | fork |
lib.rs | fork |
version | 0.2.0 |
source | src |
created_at | 2019-10-23 09:08:09.031679 |
updated_at | 2024-07-19 19:33:00.838159 |
description | Library for creating a new process detached from the controlling terminal (daemon) |
homepage | https://docs.rs/fork/latest/fork/ |
repository | https://github.com/immortal/fork |
max_upload_size | |
id | 174826 |
size | 15,672 |
Library for creating a new process detached from the controlling terminal (daemon).
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 willchdir
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 theps
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