48 lines
1.5 KiB
JavaScript
48 lines
1.5 KiB
JavaScript
"use strict";
|
|
|
|
/*
|
|
* systemdサービスの停止・起動・状態確認。restore.js がリストア前後に
|
|
* Webサービス(既定 pleasanter)を安全に止める/戻すために使用する。
|
|
*/
|
|
|
|
const { spawn } = require("child_process");
|
|
|
|
function runSystemctl(args) {
|
|
return new Promise((resolve, reject) => {
|
|
const child = spawn("systemctl", args, { stdio: ["ignore", "pipe", "pipe"] });
|
|
let stdout = "";
|
|
let stderr = "";
|
|
|
|
child.stdout.on("data", (d) => (stdout += d.toString("utf8")));
|
|
child.stderr.on("data", (d) => (stderr += d.toString("utf8")));
|
|
|
|
child.on("error", (err) => reject(new Error(`systemctl起動失敗: ${err.message}`)));
|
|
child.on("close", (code) => {
|
|
if (code !== 0) {
|
|
reject(new Error(`systemctl ${args.join(" ")} 異常終了 (code=${code}): ${(stderr || stdout).trim()}`));
|
|
return;
|
|
}
|
|
resolve({ stdout: stdout.trim(), stderr: stderr.trim() });
|
|
});
|
|
});
|
|
}
|
|
|
|
async function isServiceActive(serviceName) {
|
|
try {
|
|
const { stdout } = await runSystemctl(["is-active", serviceName]);
|
|
return stdout === "active";
|
|
} catch (_err) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
async function stopService(serviceName) {
|
|
await runSystemctl(["stop", serviceName]);
|
|
}
|
|
|
|
async function startService(serviceName) {
|
|
await runSystemctl(["start", serviceName]);
|
|
}
|
|
|
|
module.exports = { isServiceActive, stopService, startService };
|