Debian 8 Jessie下Grunt启动的Node.js应用开机自启方案咨询
我之前刚从Windows转Debian部署Node应用时,也碰到过一模一样的麻烦——每次重启都得手动敲grunt启动,太折腾了。给你两个在Debian 8 Jessie上实测有效的方案,按需选就行:
方案1:用Systemd服务(推荐,Debian 8默认支持)
Systemd是Debian 8的默认init系统,配置简单还自带进程守护,应用崩溃了能自动重启,很省心。
步骤如下:
- 创建一个systemd服务配置文件,用你习惯的编辑器就行,比如:
sudo nano /etc/systemd/system/your-app.service - 把下面的内容粘贴进去,记得替换掉所有占位符:
[Unit] Description=我的Node.js应用服务 After=network.target # 确保网络就绪后再启动应用 [Service] Type=simple User=your-username # 替换成你的系统用户名,比如你自己的账号或者www-data WorkingDirectory=/home/your-user/app-folder # 替换成你执行grunt命令的应用根目录 ExecStart=/usr/local/bin/grunt # 这里要填grunt的实际路径,用`which grunt`能查到 Restart=always # 应用意外崩溃时自动重启 RestartSec=10 # 崩溃后隔10秒再重启,避免频繁重启 Environment=NODE_ENV=production # 可选,设置环境变量,比如生产环境 [Install] WantedBy=multi-user.target # 多用户模式下开机启动 - 保存退出后,刷新systemd的配置:
sudo systemctl daemon-reload - 设置开机自启:
sudo systemctl enable your-app.service - 现在可以手动启动测试,看看能不能正常运行:
sudo systemctl start your-app.service - 查看服务状态确认没问题:
要是想查日志,用这个命令实时查看:sudo systemctl status your-app.servicejournalctl -u your-app.service -f
方案2:用传统SysVinit脚本
如果你更习惯传统的init.d脚本,Debian 8也支持这种方式:
- 创建init脚本文件:
sudo nano /etc/init.d/your-app - 粘贴下面的内容,同样要替换占位符:
#!/bin/sh ### BEGIN INIT INFO # Provides: your-app # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: 启动/停止我的Node.js应用 ### END INIT INFO USER=your-username APP_DIR=/home/your-user/app-folder GRUNT_PATH=$(which grunt) case "$1" in start) echo "正在启动your-app..." su - $USER -c "cd $APP_DIR && $GRUNT_PATH &" ;; stop) echo "正在停止your-app..." pkill -f "$GRUNT_PATH" ;; restart) $0 stop sleep 2 $0 start ;; status) pgrep -f "$GRUNT_PATH" > /dev/null && echo "your-app 运行中" || echo "your-app 已停止" ;; *) echo "使用方法: /etc/init.d/your-app {start|stop|restart|status}" exit 1 ;; esac exit 0 - 给脚本添加执行权限:
sudo chmod +x /etc/init.d/your-app - 设置开机自启:
sudo update-rc.d your-app defaults - 测试启动:
sudo /etc/init.d/your-app start
一些注意事项
- 一定要确认
grunt的路径正确!用which grunt命令就能查到,别瞎填。 - 尽量不要用root用户运行应用,用普通用户或者www-data更安全。
- 如果你的应用依赖特定的环境变量,记得在配置里加上,比如Systemd里的
Environment字段,或者init脚本里用export NODE_ENV=production。
我自己用的是Systemd方案,跑了大半年没出过问题,重启系统后自动就起来了,完全不用管。要是遇到启动失败,先查路径、用户权限,再看日志,基本都能解决。
内容的提问来源于stack exchange,提问作者user3226864
相关产品推荐
相关产品推荐

