作为 systemd 服务运行时,节点生成进程未执行

问题描述 投票:0回答:1

我正在运行一个使用 msmtp 发送电子邮件的节点应用程序。当简单地以用户身份运行应用程序时(例如在屏幕中),它可以正确使用我的

.msmtprc
并能够使我们的邮件服务器传递邮件。

我现在将该应用程序安装为 systemd 服务,因此如果它因任何原因崩溃,它会重新启动。

配置为:

[UNIT]
Description=MyApp

[SERVICE]
Type=simple
WorkingDirectory=/home/me/app
ExecStart=/usr/bin/npm run start
User=me
Group=me
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

一切正常,但发送邮件除外。我通过生成 msmtp 进程并将邮件内容写入其标准输入来执行此操作:

try {
  const process = child_process.spawn(
    "msmtp",
    ["-t"]
  );
  process.stdin.write("From: " + returnMail + "\n");
  process.stdin.write("MIME-Version: 1.0\n");
  process.stdin.write("Content-Type: text/html\n");
  process.stdin.write("To: " + recepient + "\n");
  process.stdin.write(
    "Subject: Some Subject\n\n"
  );
  process.stdin.write(`<!DOCTYPE HTML>
<html>
<head><title>Some Subject</title>
<body>
<h1>Something happened</h1>
<h2>Oh No!</h2>
<div>${content}</div>
</body>
</html>`
  );
  process.stdin.end();
} catch (error) {
  console.error(error);
  return;
}

我没有得到任何错误输出(当观察生成进程的 stdout 和 stderr 时)或捕获意味着该进程未执行的错误。

node.js systemd child-process msmtp
1个回答
0
投票

systemd 服务似乎无法遵循符号链接。我将“sendmail”设置为“msmtp”的符号链接,并通过将名为 sendmail 的符号链接放入我的 /usr/local/bin 中,将“sendmail”用作 msmtp 的别名。像上面的代码一样将 msmtp 硬编码为可执行文件。

© www.soinside.com 2019 - 2024. All rights reserved.