noded安卓app_Node 应用的 Systemd 启动

本文详细介绍了如何使用Systemd启动一个Node.js应用,包括克隆代码、修改配置文件、启动服务、查看状态、重启和停止服务,以及Socket激活的配置和启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面的文章介绍了 Systemd 的操作命令和基本用法,今天给出一个实例,如何使用 Systemd 启动一个 Node 应用。

本文是独立的,不需要前面的教程作为预备知识。

一、克隆代码

首先,下载示例库。

$ git clone https://github.com/ruanyf/node-systemd-demo.git

$ cd node-systemd-demo

示例脚本server.js非常简单,就是一个 HTTP 服务器。

var http = require('http');

var hostname = '0.0.0.0';

var port = 5000;

http.createServer(function(req, res) {

res.writeHead(200, {'Content-Type': 'text/plain'});

res.end('Hello World');

}).listen(port, hostname, function () {

console.log('Server running at http://%s:%s/', hostname, port);

});

二、修改配置文件

Systemd 启动上面这个脚本,需要一个配置文件node-server.service。这个文件的文件名可以随便取,但是后缀名必须是.service。

[Unit]

Description=node simple server

[Service]

ExecStart=[/path/to/node/executable] [path/to/node-systemd-demo]/server.js

Restart=always

User=[yourUserName]

Group=[yourUserGroup]

Environment=PATH=/usr/bin:/usr/local/bin

Environment=NODE_ENV=production

WorkingDirectory=[/path/to/node-systemd-demo]

[Install]

WantedBy=multi-user.target

上面脚本里面,有五个地方出现了四个占位符。

[/path/to/node/executable]:node可执行文件的绝对路径

[path/to/node-systemd-demo]:示例库的绝对路径

[yourUserName]:你的用户名

[yourUserGroup]:你的组名

你需要将上面这四个占位符,改成自己电脑的设置。下面是一个已经改好的例子。

[Unit]

Description=node simple server

[Service]

ExecStart=/usr/bin/node /tmp/node-systemd-demo/server.js

Restart=always

User=nobody

Group=nobody

Environment=PATH=/usr/bin:/usr/local/bin

Environment=NODE_ENV=production

WorkingDirectory=/tmp/node-systemd-demo

[Install]

WantedBy=multi-user.target

如果你不知道这几个占位符的值,下面的命令可以帮你找出来。

# node executable path

$ which node

# your user name

$ id -un

# your group name

$ id -gn

三、配置文件的解释

简单解释一下,上面的配置文件的几个参数。

Unit区块的Description字段,是服务的简单描述。

Service区块的字段含义如下。

ExecStart:启动命令

Restart:如何重启。always表示如果进程退出,总是重启

Environment:环境变量

WorkingDirectory:工作目录

Install区块的WantedBy字段指定,设为开机启动时,该服务所在的 Target 是multi-user.target。

四、启动服务

现在将配置文件拷贝到 Systemd 之中。

$ sudo cp node-server.service /etc/systemd/system

接着,就启动服务。

# 重载配置文件

$ sudo systemctl daemon-reload

# 启动服务

$ sudo systemctl start node-server

访问 http://0.0.0.0:5000,应该看到网页显示"Hello World"。

五、查看状态

如果启动失败,或者想查看日志,就要执行下面的命令。

# 查看状态

$ sudo systemctl status node-server

# 查看日志

$ sudo journalctl -u node-server

# 实时输出最新日志

$ sudo journalctl --follow -u node-server

六、重启服务和停止服务

# 重启服务

$ sudo systemctl restart node-server

# 停止服务

$ sudo systemctl stop node-server

如果想设为开机启动,就要执行systemctl enable。

$ sudo systemctl enable node-server

七、Socket 激活

一般情况下,学到这里,应该就够用了。如果你还想体验一下 Systemd 的强大功能,请接着往下读。

我们知道,HTTP服务器启动在那里,终究是耗费资源的。那么能不能做到,只有有人访问时,才启动服务,否则就关闭?

这在 Systemd 里面叫做"Socket 激活"。开发者可以指定 Socket 监听的端口,系统根据有没有收到请求,自动启动或关闭服务。不难想到,只要前面加一层负载均衡器,这就等同于实现了一个简单的云服务,即根据访问量,系统自动扩容或收缩。

下面就是"Socket 激活"的Demo。

八、安装依赖

首先,请确认前面启动的 Node 服务已经被关闭了,5000 端口已经释放出来了。

require('systemd');

require('autoquit');

var http = require('http');

var server = http.createServer(function(req, res) {

res.writeHead(200, {'Content-Type': 'text/plain'});

res.end('Hello World');

});

server.autoQuit({ timeOut: 60 });

server.listen('systemd');

console.log('Server running at http://0.0.0.0:5000/');

上面代码中,systemd模块用于添加"Socket 激活",autoquit模块用于指定多少时间无人访问后,关闭 Node 服务,上面脚本是60秒。另外,还有一个journald模块,用于向 Systemd 日志添加内容,这个例子中没有使用。

现在,安装依赖。

$ npm install

九、改写配置文件

Socket 激活需要两个配置文件。

[Socket]

ListenStream=5000

[Install]

WantedBy=sockets.target

[Unit]

Description=node simple server (socket activation)

[Service]

ExecStart=[/path/to/node/executable] [path/to/node-systemd-demo]/socket-server.js

User=[yourUserName]

Group=[yourGroupName]

Environment=PATH=/usr/bin:/usr/local/bin

Environment=NODE_ENV=production

WorkingDirectory=[/path/to/node-systemd-demo]

上面这个文件需要改写占位符。可以看到,由于不是开机启动,配置文件里面没有Install区块;由于不需要重启,也没有Restart字段。

改写后,将它们拷贝到 Systemd。

$ sudo cp node-socket-server.socket /etc/systemd/system

$ sudo cp node-socket-server.service /etc/systemd/system

十、启动 Socket 激活

然后,执行下面两个命令,启动 Socket 激活。

$ sudo systemctl daemon-reload

$ sudo systemctl start node-socket-server.socket

这个时候,检查一下状态。

$ sudo systemctl status node-socket-server.socket

● node-socket-server.socket

Loaded: loaded (/etc/systemd/system/node-socket-server.socket; disabled)

Active: active (listening) since 2016-03-10 20:36:41 CST; 7s ago

Listen: [::]:5000 (Stream)

$ sudo systemctl status node-socket-server.service

● node-socket-server.service - node simple server (socket activation)

Loaded: loaded (/etc/systemd/system/node-socket-server.service; disabled)

Active: inactive (dead)

可以看到,node-socket-server.socket是激活的(active),而node-socket-server.service没有(inactive)。

这时访问 http://0.0.0.0:5000 ,会发现网页可以正常访问。

然后,再检查一下状态。

$ sudo systemctl status node-socket-server.socket

● node-socket-server.socket

Loaded: loaded (/etc/systemd/system/node-socket-server.socket; disabled)

Active: active (running) since 2016-03-10 20:36:41 CST; 1min 20s ago

Listen: [::]:5000 (Stream)

$ sudo systemctl status node-socket-server.service

● node-socket-server.service - node simple server (socket activation)

Loaded: loaded (/etc/systemd/system/node-socket-server.service; disabled)

Active: active (running) since 2016-03-10 20:37:55 CST; 3min 11s ago

Main PID: 1084 (node)

CGroup: /system.slice/node-socket-server.service

└─1084 node /home/ruanyf/project/node-systemd-demo/socket-server.js

这时,socket和service都激活了。

十一、停止服务

此时,如果手动停止 HTTP 服务器,Systemd 会发出一个警告。

$ sudo systemctl stop node-socket-server.service

Warning: Stopping node-socket-server.service, but it can still be activated by:

node-socket-server.socket

上面的警告表示,Socket 依然是激活的,因此服务随时可能被重启,所以还需要关闭 Socket 激活。

$ sudo systemctl stop node-socket-server.socket

十二、参考链接

(完)

<think>好的,我现在需要回答用户关于“Linux应用放后台启动”的问题。首先,我得理解用户的需求,他们可能希望知道如何让应用程序在后台运行,以便在关闭终端后程序仍然持续运行,或者同时执行其他任务。 我应该先回忆几种常见的方法。记得有在命令末尾加上&符号的方法,这会将进程放到后台,但可能终端关闭后进程会被终止。所以需要结合nohup或者disown来保持运行。另外,还有使用screen或者tmux这样的终端复用工具,它们允许会话在后台保持活动。 接下来,我应该分步骤介绍每种方法,确保用户能清楚操作。首先介绍&符号,然后说明其局限性,比如退出终端后进程可能会结束,这时候引入nohup命令,说明如何将输出重定向到文件。然后提到disown命令,用于让作业脱离当前shell。之后介绍screen和tmux,说明它们的基本用法,比如创建会话、分离和重新连接。 需要确保每个步骤的命令示例准确,比如nohup的正确用法,输出重定向到nohup.out或者其他文件。同时提醒用户注意,如果终端关闭,使用&而不加nohup可能会导致进程终止,因此需要结合使用。 还要考虑用户可能的疑问,比如如何查看后台任务,可以用jobs命令,或者用ps和grep查找进程。如果需要将正在运行的前台任务转到后台,可以使用Ctrl+Z暂停,然后bg命令继续运行,再用disown。 另外,可能需要提到systemd或者创建服务的方式,但对于一般用户来说,可能稍微复杂,可以作为高级选项简要提及。 最后,总结各种方法的适用场景,比如临时任务用&和nohup,需要长时间运行且可能断开的会话用screen/tmux,系统服务用systemd。确保语言简洁明了,避免技术术语过多,但必要的术语需要解释清楚。 检查是否有遗漏的方法或常见错误,比如权限问题,或者输出重定向路径不可写的情况。可能需要提醒用户检查日志文件,确保程序运行正常。 现在组织语言,分点说明每种方法,给出示例命令,并比较它们的优缺点,帮助用户选择最适合的方式。</think>在 Linux 系统中,将应用程序放到后台运行是常见的需求,以下是几种常用方法及详细说明: --- ### 一、使用 `&` 符号(基础方法) **命令格式** ```bash command & ``` **示例** ```bash python3 script.py & ``` **特点** - 进程会立即在后台运行 - 终端关闭后进程会被终止 - 输出内容仍会打印到当前终端 --- ### 二、`nohup` + `&`(脱离终端运行) **命令格式** ```bash nohup command > output.log 2>&1 & ``` **示例** ```bash nohup java -jar app.jar > app.log 2>&1 & ``` **说明** - `nohup`:忽略 SIGHUP 信号,终端关闭后进程继续运行 - `> output.log`:将标准输出重定向到文件 - `2>&1`:将错误输出合并到标准输出 - 日志默认会写入 `nohup.out`(未指定输出文件时) --- ### 三、`disown`(脱离当前 Shell 管理) **步骤** 1. 启动程序到后台 ```bash command & ``` 2. 查看作业 ID ```bash jobs -l ``` 3. 解除与 Shell 的关联 ```bash disown %1 # %1 是作业编号 ``` **特点** - 进程将脱离当前 Shell 控制 - 终端关闭后进程仍运行 --- ### 四、`screen` / `tmux`(终端复用工具) #### 1. 使用 `screen` ```bash # 启动新会话 screen -S session_name # 运行命令(如启动应用) python3 server.py # 分离会话(按 Ctrl+A 后按 D) # 重新连接会话 screen -r session_name ``` #### 2. 使用 `tmux` ```bash # 新建会话 tmux new -s session_name # 运行命令 node app.js # 分离会话(按 Ctrl+B 后按 D) # 重新连接 tmux attach -t session_name ``` **优势** - 支持断开会话后重新连接 - 可管理多个后台任务 --- ### 五、系统服务(Systemd) **适用场景** 需要长期运行的服务(如 Web 服务器) **步骤** 1. 创建服务文件 ```bash sudo nano /etc/systemd/system/myapp.service ``` 2. 写入配置(示例) ```ini [Unit] Description=My Application [Service] ExecStart=/usr/bin/python3 /path/to/app.py WorkingDirectory=/path/to/ Restart=always User=myuser [Install] WantedBy=multi-user.target ``` 3. 启动并设置开机自启 ```bash sudo systemctl daemon-reload sudo systemctl start myapp sudo systemctl enable myapp ``` --- ### 六、其他技巧 1. **将前台任务转后台** - 按 `Ctrl+Z` 暂停任务 - 执行 `bg` 恢复任务到后台 - 最后用 `disown %1` 脱离 Shell 2. **查看后台进程** ```bash jobs -l # 查看当前 Shell 的后台任务 ps aux | grep "command" # 全局搜索进程 ``` --- ### 总结对比 | 方法 | 终端关闭后存活 | 输出日志管理 | 适用场景 | |---------------|----------------|--------------|------------------------| | `&` | ❌ | 直接显示 | 临时后台任务 | | `nohup` | ✔️ | 需重定向 | 长期运行且脱离终端 | | `screen/tmux` | ✔️ | 可查看 | 需要交互或重新连接的场景 | | `systemd` | ✔️ | 系统日志 | 生产环境服务 | 根据需求选择最适合的方案,临时任务推荐 `nohup`,复杂场景建议使用 `tmux` 或 `systemd`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值