启动一个 rust 二进制文件作为 systemd 守护进程

Start a rust binary as a systemd daemon

我正在研究如何 运行 在 Ubuntu 中将 rust 二进制文件作为 systemd 守护进程,但到目前为止还不是很成功。

我想要达到的目标:

我为此使用 daemonize 板条箱。我是生锈的新手,也没有守护进程的经验。也许我做错了一些基本的事情。

extern crate daemonize;

use chrono::{DateTime, Utc};
use daemonize::Daemonize;
use std::fs::File;
use std::io::prelude::*;
use std::{thread, time};

fn main() {
    let args = std::env::args().collect::<Vec<String>>();
    let user = &(*args[1]);
    let group = &(*args[2]);
    let file = &args[3];

    let stdout = File::create("/tmp/daemon.out").unwrap();
    let stderr = File::create("/tmp/daemon.err").unwrap();

    let sleep_time = time::Duration::from_millis(3 * 1000);

    let mut file = std::fs::OpenOptions::new()
        .append(true)
        .create(true)
        .open(file)
        .unwrap();

    let daemonize = Daemonize::new()
        .user(user)
        .group(group)
        .working_directory("/tmp") // for default behaviour.
        .stdout(stdout) // Redirect stdout to `/tmp/daemon.out`.
        .stderr(stderr); // Redirect stderr to `/tmp/daemon.err`.

    match daemonize.start() {
        Ok(()) => loop {
            let now: DateTime<Utc> = Utc::now();
            let date = format!("UTC now is: {}\n", now);
            file.write_all(date.as_bytes()).unwrap();
            thread::sleep(sleep_time);
        },
        Err(err) => file
            .write_all(format!("error: {}", err).as_bytes())
            .unwrap(),
    };
}

在网上找了一个服务文件,稍作调整...

/etc/systemd/system/daemon-test.服务

After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=julian
ExecStart=/home/julian/daemon-test/target/debug/daemon-test julian julian /home/julian/Desktop/daemon.txt

[Install]
WantedBy=multi-user.target

我尝试用 systemctl start daemon-test 启动服务,但没有任何反应。当我 运行 systemctl status daemon-test 我收到这条消息:

systemctl status daemon-test                        
● daemon-test.service
     Loaded: loaded (/etc/systemd/system/daemon-test.service; disabled; vendor preset: enabled)
     Active: failed (Result: start-limit-hit) since Sat 2020-07-25 22:53:39 CEST; 31s ago
    Process: 72620 ExecStart=/home/julian/daemon-test/target/debug/daemon-test julian julian /home/julian/Desktop/daemon.txt (code=exited, status=0/SUCCESS)
   Main PID: 72620 (code=exited, status=0/SUCCESS)

Jul 25 22:53:39 jubuntu systemd[1]: daemon-test.service: Scheduled restart job, restart counter is at 5.
Jul 25 22:53:39 jubuntu systemd[1]: Stopped daemon-test.service.
Jul 25 22:53:39 jubuntu systemd[1]: daemon-test.service: Start request repeated too quickly.
Jul 25 22:53:39 jubuntu systemd[1]: daemon-test.service: Failed with result 'start-limit-hit'.
Jul 25 22:53:39 jubuntu systemd[1]: Failed to start daemon-test.service.
Jul 25 22:54:10 jubuntu systemd[1]: /etc/systemd/system/daemon-test.service:1: Assignment outside of section. Ignoring.
Jul 25 22:54:10 jubuntu systemd[1]: /etc/systemd/system/daemon-test.service:2: Assignment outside of section. Ignoring.

Type=simple 适用于“新式守护进程”,你不应该用它们进行双叉守护进程舞蹈,systemd 会处理它。参见 https://www.freedesktop.org/software/systemd/man/daemon.html