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

fork

创建与控制终端(守护进程)分离的新进程的库

25个版本

0.2.0 2024年7月19日
0.1.23 2024年2月1日
0.1.22 2023年6月6日
0.1.21 2023年3月12日
0.1.9 2019年10月28日

57操作系统 类别中

Download history 12790/week @ 2024-04-20 16436/week @ 2024-04-27 12198/week @ 2024-05-04 20508/week @ 2024-05-11 19566/week @ 2024-05-18 13196/week @ 2024-05-25 13283/week @ 2024-06-01 10809/week @ 2024-06-08 11675/week @ 2024-06-15 18272/week @ 2024-06-22 9205/week @ 2024-06-29 13084/week @ 2024-07-06 13356/week @ 2024-07-13 18119/week @ 2024-07-20 17419/week @ 2024-07-27 17481/week @ 2024-08-03

69,075 每月下载量
2727 个crate中(直接使用26个) 使用

BSD-3-Clause

11KB
81

fork

crates.io Build codecov docs

创建与控制终端(守护进程)分离的新进程的库。

为什么?

  • 用于守护进程化、分叉、双重分叉进程的最小库。
  • daemon(3) 已在 MacOSX 10.5 中弃用,通过使用 forksetsid 系统调用,可以创建新方法来实现相同的目标。

示例

创建一个新的测试项目

$ cargo new --bin myapp

要安装 cargo 使用: curl https://sh.rustup.rs -sSf | sh

fork 添加为依赖项

cargo add fork

或编辑 myapp/Cargo.toml 并将其添加到 [dependencies]

fork = "0.1"

将以下代码添加到 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");
    }
}

如果使用 daemon(false, false),它将 chdir/ 并关闭标准输入、标准输出和标准错误文件描述符。

测试运行

$ cargo run

使用 ps 检查进程,例如

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

egrep 用于显示 ps 头部

输出应该是类似以下内容

 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 这是父进程

  • TTY = ?? 没有控制终端

  • 新的 PGID = 48737

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

依赖项

~43KB