proc 1.0.0
Library for managing running processes and trees of them
To use this package, run the following command in your project's root directory:
Manual usage
Put the following dependency into your project's dependences section:
proc
proc is a library to run single processes and manage trees of them. It provides conveniences such as timeouts, output drains and sandboxing for single processes. The process tree handling map up all running processes on the system for convenient analyze such as killing a subtree.
Getting Started
proc depends on the following software packages:
- D compiler (dmd 2.079+, ldc 1.11.0+)
It is recommended to install the D compiler by downloading it from the official distribution page.
# link https://dlang.org/download.html
curl -fsS https://dlang.org/install.sh | bash -s dmd
Download the D compiler of your choice, extract it and add to your PATH shell variable.
# example with an extracted DMD
export PATH=/path/to/dmd/linux/bin64/:$PATH
Once the dependencies are installed it is time to download the source code to install proc.
git clone https://github.com/joakim-brannstrom/proc.git
cd proc
dub build -b release
Done! Have fun. Don't be shy to report any issue that you find.
Examples
This is a couple of examples of how the library can be used.
A sandbox is in this library a way of assuring that any subprocesses that that are spawned have are also killed when the root is terminated. This is most probably used in conjunction with timeout.
auto p = pipeProcess([scriptName]).sandbox.scopeKill;
// do stuff. force a kill
p.kill;
To kill a process after a timeout.
auto p = pipeProcess(["sleep", "1m"]).timeout(100.dur!"msecs").scopeKill;
// do stuff. the timeout triggers
p.wait; // the exit code of the root process
And then to combine both of them.
auto p = pipeProcess([script]).sandbox.timeout(1.dur!"seconds").scopeKill;
// do stuff
p.wait; // the exit code of the root process
To drain all output from a process by line. The element returned have an
attribute, type
, which allow you to see if it is stdout
or stderr
. Of
note is that the draining is conservative and thus any non-valid UTF8 will
result in a large part of the output being discarded. Pull requests to improve
this is welcome.
auto p = pipeProcess(["dd", "if=/dev/zero", "bs=10", "count=3"]).scopeKill;
foreach (l; p.process.drainByLineCopy(100.dur!"msecs").filter!"!a.empty")
writeln(l);
The draining by line do have an overhead. Use the basic drain if you do not need it to be exactly by line.
auto p = pipeProcess(["dd", "if=/dev/zero", "bs=10", "count=3"]).scopeKill;
foreach (l; p.process.drain(100.dur!"msecs").filter!"!a.empty")
writeln(l);
The final is a combination of all the separate wheels.
auto p = pipeProcess(["proc"]).sandbox.timeout(1.dur!"seconds").scopeKill;
foreach (l; p.process.drain(100.dur!"msecs").filter!"!a.empty")
writeln(l);
The library have functionality to analyze all running processes and present them in an easily digested format. To create such a map:
auto t = makePidMap();
Lets say you want to kill all subtrees of the init process that are owned by the current user:
auto pmap = makePidMap().filterByCurrentUser;
foreach (ref t; pmap.splitToSubMaps) {
reap(proc.kill(t));
}
Or maybe you just want to print the whole tree:
auto pmap = makePidMap().filterByCurrentUser;
foreach (p; pmap.pids) {
writefln(" pid:%s %s", p.to!string, pmap.getProc(p));
}
- Registered by Joakim Brännström
- 1.0.0 released 4 years ago
- joakim-brannstrom/proc
- BSL-1.0
- Copyright © 2020, Joakim Brännström
- Authors:
- Dependencies:
- none
- Versions:
-
1.1.5 2024-Mar-26 1.1.4 2022-Jun-02 1.1.3 2022-May-17 1.1.2 2021-Aug-15 1.1.1 2021-Jan-25 - Download Stats:
-
-
0 downloads today
-
1 downloads this week
-
2 downloads this month
-
72 downloads total
-
- Score:
- 0.6
- Short URL:
- proc.dub.pm