4 个稳定版本
2.0.0 | 2024 年 4 月 20 日 |
---|---|
1.0.3 | 2023 年 12 月 19 日 |
1.0.2 | 2023 年 12 月 9 日 |
1.0.1 | 2023 年 11 月 29 日 |
1.0.0 |
|
#45 在 macOS 和 iOS API 中
28,200 每月下载量
在 11 个 包(2 个直接)中使用
135KB
3K SLoC
进程管理器
Watchexec 的进程管理器。
- API 文档.
- 在 Apache 2.0 许可下。
- 状态:维护中。
lib.rs
:
Watchexec 的进程管理器。
此包实现了 Watchexec 的进程管理器。它负责创建和管理进程,并向它们发送事件。
您可以使用此包来实现自己的进程管理器,但请注意,其方向将始终主要受 Watchexec 自身的需要驱动。
用法
没有单个管理器的结构体或实现,因为应用程序的具体需求将决定其设计方式。相反,此包提供了一个 Job
构造,它是单个 Command
的句柄,并管理其生命周期。该 Job
API 是基于 systemctl
服务控制命令集的,具有启动、停止、重启、发送信号、等待进程完成等操作。
还有在作业的运行时任务中运行钩子和处理错误的方法。
工作原理
在严格意义上,Job
是一个句柄,允许控制一个 Tokio 任务。该任务在 Tokio 运行时上启动,因此它在后台运行。一个 Job
接受一个 Command
作为输入,该命令描述了如何通过 shell 命令或直接的可执行文件调用启动单个进程,以及进程是否应该分组(使用 command-group
)或不是。
该任务的执行在两个源上运行事件循环:进程的wait()
(即进程结束时)和作业的控制队列。控制队列是一个混合MPSC队列,具有三个优先级和一个定时器。当定时器处于活动状态时,最低优先级(“正常”)的队列被禁用。这是一个内部细节,用于实现优雅的停止和重启。作业任务的内部细节对API用户不可用,操作和查询通过在此控制队列上发送消息来执行。
控制队列按优先级和优先级内的顺序执行。向任务发送控制操作会返回一个Ticket
,这是一个在控制操作被处理时解决的未来。丢弃票据不会取消控制操作。这提供了两种互补的方式来编排操作:如果没有分支流程或信号的需求,则按所需顺序排队控制操作,或者在等待票据后发送控制操作或执行其他操作。
请注意,这两个都可以一起使用。不需要以下模式
#
#
job.start().await;
job.signal(Signal::User1).await;
job.stop().await;
由于排序,其行为与以下相同
#
#
job.start();
job.signal(Signal::User1);
job.stop().await; // here, all of start(), signal(), and stop() will have run in order
然而,这是一个不同的程序
#
#
job.start().await;
println!("program started!");
sleep(Duration::from_secs(5)).await; // wait until program is fully started
job.signal(Signal::User1).await;
sleep(Duration::from_millis(150)).await; // wait until program has dumped stats
println!("program stats dumped via USR1 signal!");
job.stop().await;
println!("program stopped");
#
示例
use watchexec_supervisor::Signal;
use watchexec_supervisor::command::{Command, Program};
use watchexec_supervisor::job::{CommandState, start_job};
let (job, task) = start_job(Arc::new(Command {
program: Program::Exec {
prog: "/bin/date".into(),
args: Vec::new(),
}.into(),
options: Default::default(),
}));
job.start().await;
job.signal(Signal::User1).await;
job.stop().await;
job.delete_now().await;
task.await; // make sure the task is fully cleaned up
依赖项
~6-15MB
~177K SLoC