Lua - 在 Crontab 中通过 os.execute 命令运行脚本时出错 - 退出代码 = 32512

我有一个 Lua 脚本,我正在尝试通过 crontab 运行它 -请参见下面的请求/计划。

# m h  dom mon dow   command
0 8 * * * /usr/bin/lua /home/pi/shared/TS_cabin_graph_watts_12h.lua >/home/pi/shared/watts.log 2>&1
1 8 * * * /usr/bin/lua /home/pi/shared/TS_cabin_graph_temp_12h.lua >/home/pi/shared/temp.log 2>&1

整个脚本做了很多事情,但下面是特定的 os.execute 图形请求。

print("开始: 图形命令")
local x = os.execute('graph /home/pi/shared/feed12hr.csv -y 9,10 --ylabel Temp --title CabinTemp --figsize 1600x1000 --output /home/pi/shared/cabingraph12hr.png')
print(x)
print("结束: 图形命令")

当我手动在命令行中运行它时,它可以正常工作,请参见下面的输出。

开始: 图形命令
/usr/local/lib/python2.7/dist-packages/pandas/plotting/_converter.py:129: FutureWarning: Using an implicitly registered datetime converter for a matplotlib plotting method. The converter was registered by pandas on import. Future versions of pandas will require you to explicitly register matplotlib converters.

To register the converters:
        >>> from pandas.plotting import register_matplotlib_converters
        >>> register_matplotlib_converters()
  warnings.warn(msg, FutureWarning)
0
结束: 图形命令

但是,当我通过 cronjob 运行它后检查日志时,它会失败并报告以下内容。

第4部分
开始: 图形命令
32512
结束: 图形命令

有什么原因和所需修复措施吗?

点赞
用户1847592
用户1847592

错误意味着“找不到文件”。

这是因为 cron 以非常简化的 $PATH 运行您的任务,因此在调用 os.execute() 时必须指定 graph 可执行文件的完整路径。

2021-03-31 10:41:50
用户7509065
用户7509065

在Lua 5.1中,os.execute返回C语言的system函数返回的任何内容。在Linux中,使用在man 3 system中解释的解码宏,返回值32512解码为WIFEXITED(s)&& WEXITSTATUS(s) == 127。在新版本的Lua中,您不必手动解码,因为它会自动解码并返回nil,'exit',127。退出代码的原因是system运行一个shell,当shell返回127时,是因为它找不到您告诉它执行的文件。您在cron作业中遇到此问题但交互式没有遇到的最可能的原因是,cron作业使用不同的环境变量集,并且cron中的PATH环境变量不包含graph的位置。交互式地运行which graph以查看它在哪里,然后更新您的脚本以使用该完整路径。

2021-03-31 21:13:03