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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:29:53