迁移到云后,重定向操作符现在在 cron 作业中失败

迁移到云后,重定向操作符现在在 cron 作业中失败

我的 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 中都应该用双引号引起来。)

相关内容