启动一个 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
我正在研究如何 运行 在 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