我的 cronjob 中有这样一行:
22 9 * * 1-5 cd ~/execution/samples/Cpp/data_logger/; ./data_logger_static 127.0.0.1 $TWS_LIVE_PORT &> SPY-STK.csv
它运行良好,并将一堆数据写入名为的文件中SPY-STK.csv
。
但是,我最近将它发送到远程服务器,它停止工作了。文件已创建,但只是空的。到处都是相同的代码,我也试图保持操作系统相同。不知道要检查什么。
- 旧本地机器操作系统:Ubuntu 22.04
- 新的远程机器操作系统:Ubuntu 23.10
- 旧 bash 版本:GNU bash,版本 5.1.16(1)-release(x86_64-pc-linux-gnu)
- 新的远程机器 bash:GNU bash,版本 5.2.15(1)-release(x86_64-pc-linux-gnu)
我感兴趣的输出来自错误输出流(即std::cerr
在 c++ 中)。
答案1
stdout &>
+stderr 重定向是巴什主义- cron 作业的默认 shell/bin/sh
会将其解释为&
(将作业放在后台)和>
(仅重定向标准输出)。
因此,可以使用 POSIX 重定向
22 9 * * 1-5 ... "$TWS_LIVE_PORT" > SPY-STK.csv 2>&1
或者在作业输入之前将 cron shell 设置为 bash
SHELL=/bin/bash
22 9 * * 1-5 ... "$TWS_LIVE_PORT" &> SPY-STK.csv
(诸如此类的变量扩展$TWS_LIVE_PORT
在 sh 和 bash 中都应该用双引号引起来。)