| Crates.io | fork |
| lib.rs | fork |
| version | 0.2.0 |
| created_at | 2019-10-23 09:08:09.031679+00 |
| updated_at | 2024-07-19 19:33:00.838159+00 |
| 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
cargouse: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 willchdirto/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"
egrepis used to show thepsheaders
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