如何从终端向树莓派上Puppeteer/Node.js运行的网络爬虫发送信号?
两种简单的手动触发爬虫方案
方案一:系统信号触发(轻量无额外依赖)
Node.js原生支持监听系统信号,无需安装额外包,步骤非常简单:
- 修改你的爬虫脚本,添加信号监听逻辑:
// 假设你的核心下载函数是这个 function downloadData() { // 这里写你的Puppeteer爬取逻辑 console.log('开始执行数据下载...'); } // 监听自定义信号SIGUSR1 process.on('SIGUSR1', () => { console.log('收到手动触发指令,立即启动下载'); downloadData(); }); // 保留原来的定时任务(示例用node-schedule,如果你用其他定时工具也一样) const schedule = require('node-schedule'); // 每天6点、18点执行 schedule.scheduleJob('0 6,18 * * *', downloadData);
- 手动触发时,在另一个终端执行命令:
先找到爬虫进程的ID,或者直接用命令自动匹配:
# 自动找到爬虫进程并发送信号(把crawler.js换成你的脚本文件名) kill -SIGUSR1 $(pgrep -f "node crawler.js")
如果怕匹配错进程,可以先用ps aux | grep node确认PID,再执行kill -SIGUSR1 进程ID。
方案二:HTTP接口触发(直观易操作)
给爬虫加一个极简的HTTP接口,通过curl或浏览器访问就能触发,新手更容易上手:
- 修改爬虫脚本,添加HTTP服务器逻辑:
const http = require('http'); function downloadData() { // 你的Puppeteer爬取逻辑 console.log('开始执行数据下载...'); } // 创建简单的HTTP服务器 const server = http.createServer((req, res) => { // 只响应/run路径的GET请求 if (req.url === '/run' && req.method === 'GET') { downloadData(); res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('已触发数据下载\n'); } else { res.writeHead(404, {'Content-Type': 'text/plain'}); res.end('无效接口\n'); } }); // 监听本地3000端口(端口可以自己改) server.listen(3000, 'localhost', () => { console.log('手动触发服务已启动,访问 http://localhost:3000/run 即可触发下载'); }); // 保留原来的定时任务 const schedule = require('node-schedule'); schedule.scheduleJob('0 6,18 * * *', downloadData);
- 手动触发时,在另一个终端执行:
curl http://localhost:3000/run
如果树莓派有桌面环境,也可以直接打开浏览器访问这个地址。
方案对比
- 信号触发:无需额外端口,资源占用极低,适合追求轻量的场景;需要记简单的命令。
- HTTP接口:操作更直观,不用管进程ID,适合对命令行不太熟悉的新手。
内容的提问来源于stack exchange,提问作者drb01
相关产品推荐
相关产品推荐

