Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/ralith/sd-listen-fds

Minimal self-contained crate to accept file descriptors from systemd
https://github.com/ralith/sd-listen-fds

Last synced: about 2 months ago
JSON representation

Minimal self-contained crate to accept file descriptors from systemd

Awesome Lists containing this project

README

        

# sd-listen-fds

[![Documentation](https://docs.rs/oddio/badge.svg)](https://docs.rs/sd-listen-fds/)
[![License: Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE-APACHE)
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE-MIT)

Exposes file descriptors passed in by systemd, the Linux init daemon,
without dependencies, foreign or otherwise. Enables easy
implementation of socket-activated services in pure Rust.

Unlike services that open sockets themselves, socket-activated
services are started on-demand, may start up concurrently with their
dependencies, and may be restarted without losing inbound
data. Portable applications can call `sd_listen_fds::get()` and open
their own socket if it succeeds with an empty `Vec`.

See also the
[sd_listen_fds](https://www.freedesktop.org/software/systemd/man/sd_listen_fds.html)
API exposed by the foreign `libsystemd` library. Compared to using
`libsystemd` bindings, this crate is smaller, safer, and builds
everywhere.

### Example

```rust
let fds = sd_listen_fds::get().unwrap();
let (_name, fd) = fds
.into_iter()
.next()
.expect("must be launched as a systemd socket-activated service");
let socket = TcpListener::from(fd);
```

my-service.socket (see also [systemd.socket](https://www.freedesktop.org/software/systemd/man/systemd.socket.html))
```ini
[Socket]
# TCP port number. Other types of sockets are also possible.
ListenStream=1234

[Install]
WantedBy=sockets.target

[Unit]
Description=My Rust service
Documentation=https://example.com/my-service/
```

my-service.service (see also [systemd.service](https://www.freedesktop.org/software/systemd/man/systemd.service.html))
```ini
[Service]
ExecStart=/path/to/my-service

[Unit]
Requires=my-service.socket
Description=My Rust service
Documentation=https://example.com/my-service/
```

## License

Licensed under either of

* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)

at your option.

### Contribution

Unless you explicitly state otherwise, any contribution intentionally
submitted for inclusion in the work by you, as defined in the
Apache-2.0 license, shall be dual licensed as above, without any
additional terms or conditions.