在Crontab中通过Python调用Node.js脚本失败问题排查
问题与解决方案
环境
- Ubuntu 22.04.2 LTS
- Python 3.11
- Node v22.2.0
问题
通过Crontab执行Python脚本时,Python能正常运行,但调用Node.js脚本(1.js)失败,返回Script execution failed.。直接在终端以用户身份运行所有脚本均正常,文件权限已设为775并添加+x权限。
涉及脚本
Node.js脚本(1.js)
const fs = require('fs'); const path = require('path'); const filePath = path.join(__dirname, '3.txt'); const currentDate = new Date().toLocaleString(); fs.appendFileSync(filePath, `${currentDate}\nTest\n`, 'utf8', (err) => { if (err) { console.error('error:', err); return; } console.log('all done'); });
Python脚本
#!/usr/bin/python3.11 import subprocess print("start script") result = subprocess.run(['node', '1.js'], capture_output=True, text=True) if result.returncode == 0: print("end script") else: print("Script execution failed.")
已尝试的无效操作
- 指定Node.js全路径:
subprocess.run(['/usr/bin/node', '1.js'], capture_output=True, text=True) - 导入os模块设置环境变量:
import os os.environ['PATH'] += ':/usr/bin/node'
解决方案
1. 用绝对路径定位Node脚本
Crontab执行时的工作目录并非脚本所在目录,Python中用相对路径1.js会找不到文件。修改Python脚本,通过绝对路径调用Node脚本:
#!/usr/bin/python3.11 import subprocess import os # 获取当前Python脚本所在目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接Node脚本的绝对路径 node_script = os.path.join(script_dir, '1.js') print("start script") # 用Node绝对路径+脚本绝对路径执行 result = subprocess.run(['/usr/bin/node', node_script], capture_output=True, text=True) # 打印错误日志便于排查 print("Node执行输出:", result.stdout) print("Node执行错误:", result.stderr) if result.returncode == 0: print("end script") else: print("Script execution failed.")
2. 修复Node脚本的同步方法错误
fs.appendFileSync是同步方法,不需要传入回调函数,错误需用try/catch捕获:
const fs = require('fs'); const path = require('path'); const filePath = path.join(__dirname, '3.txt'); const currentDate = new Date().toLocaleString(); try { fs.appendFileSync(filePath, `${currentDate}\nTest\n`, 'utf8'); console.log('all done'); } catch (err) { console.error('error:', err); }
3. 配置Crontab的工作目录与日志
在Crontab任务中指定脚本所在目录,并将输出重定向到日志文件,方便排查问题:
# 示例:每分钟执行一次,替换为你的脚本实际路径 * * * * * cd /home/your_username/scripts && /usr/bin/python3.11 your_python_script.py >> cron_exec_log.txt 2>&1
4. 确认Crontab的环境变量
如果Node是通过nvm等工具安装的,需在Crontab开头指定环境变量(比如nvm的路径):
PATH=/home/your_username/.nvm/versions/node/v22.2.0/bin:/usr/bin:/bin * * * * * cd /home/your_username/scripts && python3.11 your_python_script.py >> cron_log.txt 2>&1
内容的提问来源于stack exchange,提问作者DCS stream
相关产品推荐
相关产品推荐

