我已经对这个问题困惑了一段时间,现在我设法将问题细化为一个问题。我有一个服务,它应该运行一个 shell 脚本来启动守护进程(使用 nohup),这些进程是使用 nodejs 和 discordjs 编写的 discord 机器人。目前,我有一个服务,当我使用它运行时,它会启动测试 discord 机器人,sudo systemctl start startdiscordbots
并且运行良好。问题是当我重新启动计算机时,服务会抛出以下错误:
/daemons/discordbots/discounter/node_modules/discord.js/src/rest/RequestHandler.js:172
Aug 31 13:35:15 ubuntu start.sh[2459]: throw new HTTPError(error.message, error.constructor.name, error.status, request);
Aug 31 13:35:15 ubuntu start.sh[2459]: ^
Aug 31 13:35:15 ubuntu start.sh[2459]: HTTPError [FetchError]: request to https://discord.com/api/v9/gateway/bot failed, reason: getaddrinfo EAI_AGAIN discord.com
Aug 31 13:35:15 ubuntu start.sh[2459]: at RequestHandler.execute (/daemons/discordbots/discounter/node_modules/discord.js/src/rest/RequestHandler.js:172:15)
Aug 31 13:35:15 ubuntu start.sh[2459]: at processTicksAndRejections (node:internal/process/task_queues:96:5)
Aug 31 13:35:15 ubuntu start.sh[2459]: at async RequestHandler.push (/daemons/discordbots/discounter/node_modules/discord.js/src/rest/RequestHandler.js:50:14)
Aug 31 13:35:15 ubuntu start.sh[2459]: at async WebSocketManager.connect (/daemons/discordbots/discounter/node_modules/discord.js/src/client/websocket/WebSocketManager.js:128:9)
Aug 31 13:35:15 ubuntu start.sh[2459]: at async Client.login (/daemons/discordbots/discounter/node_modules/discord.js/src/client/Client.js:245:7) {
Aug 31 13:35:15 ubuntu start.sh[2459]: code: 500,
Aug 31 13:35:15 ubuntu start.sh[2459]: method: 'get',
Aug 31 13:35:15 ubuntu start.sh[2459]: path: '/gateway/bot',
Aug 31 13:35:15 ubuntu start.sh[2459]: requestData: { json: undefined, files: [] }
Aug 31 13:35:15 ubuntu start.sh[2459]: }
因此,我知道一旦所有其他服务都正确加载,该服务就可以正常启动,但我猜测我需要将一项服务放入我After=
遗漏的 startdiscordbots.service 文件中的部分,我的startdiscordbots.service
代码如下
[Unit]
Description=Start discord bots as background processes
After=network.target systemd-user-sessions.service
[Service]
Type=simple
ExecStart=/startup/start.sh
Restart=on-failure
RestartSec=5
KillMode=process
User=ubuntu
[Install]
WantedBy=multi-user.target
是否有人知道我是否需要在其中指定After=
我错过的服务,或者是否还有其他事情发生?
我使用的计算机是安装了 Ubuntu Server 的 RaspberryPi,我使用的是 node v16.8.0 和 npm v7.21.0 以及 discordjs v13.1.0。我只能访问终端,所以请不要告诉我使用其他工具。
任何帮助都将非常有帮助!
答案1
编写一个函数,该函数阻塞直到网络启动,进行其他测试(是否有路由default
(man ip ip-route
),您可以host google.com
(man host
)等,然后启动您的服务。我编写了一个 bash 脚本来帮助完成此操作:https://github.com/waltinator/net-o-matic
它监视连接,当连接断开时,执行用户指定的事情以尝试重新连接。一点bash
知识就可以让您修改它。阅读man bash
。