You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

node-cron仅在会话活跃时运行问题求助

解决Node.js定时任务关闭终端会话后停止的问题

你的问题本质是:终端会话关闭时,系统会向运行中的Node进程发送SIGHUP信号,默认情况下进程会响应这个信号终止运行,导致定时任务停掉。下面是几种实用的解决办法:

方法1:用nohup让进程后台运行

直接在命令前加上nohup,并在末尾加&让进程后台执行:

nohup node server/updateMovies.mjs &
  • nohup会忽略SIGHUP信号,保证会话关闭后进程继续运行
  • 默认输出会写入当前目录的nohup.out文件,如果你不想保留日志,可以重定向到空设备:
nohup node server/updateMovies.mjs > /dev/null 2>&1 &

方法2:用screen/tmux创建持久化终端会话

适合需要偶尔查看进程输出或交互的场景:

用screen的步骤:

  1. 先安装screen(Debian/Ubuntu):
sudo apt install screen

CentOS/RHEL:

sudo yum install screen
  1. 输入screen启动一个新会话
  2. 在新会话里运行node server/updateMovies.mjs
  3. 按Ctrl+A再按D,将会话后台挂起,此时关闭终端也不会影响进程
  4. 下次登录服务器后,输入screen -r就能重新连接到之前的会话

tmux的用法类似,功能更丰富,但screen对新手更友好。

方法3:注册为systemd系统服务(生产环境推荐)

这种方式能让进程被系统托管,崩溃自动重启、开机自动运行,最适合长期运行的定时任务:

  1. 创建服务配置文件:
sudo nano /etc/systemd/system/update-movies.service
  1. 写入以下内容(替换占位符为你的实际信息):
[Unit]
Description=定时更新电影数据服务
After=network.target

[Service]
User=your-username  # 替换为你的服务器用户名
WorkingDirectory=/path/to/your/project  # 替换为项目根目录
ExecStart=/usr/bin/node server/updateMovies.mjs  # 用`which node`查实际node路径
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
  1. 保存退出后,重新加载systemd配置:
sudo systemctl daemon-reload
  1. 启动服务:
sudo systemctl start update-movies
  1. 设置开机自启:
sudo systemctl enable update-movies
  1. 查看服务状态:
sudo systemctl status update-movies

内容的提问来源于stack exchange,提问作者Peter Boomsma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:05:46