更新 - 5/21/21

更新 - 5/21/21

(我发现了这个问题,这是多个问题...我将其保留原样,并在回答这个问题时解释我解决的过程)

我正在编写一个以 cron 作业形式运行的简单 Ruby 脚本。我使用 Visual Studio Code 和 Remote-Containers 扩展,它可以轻松启动在 Docker 容器中运行的 Ruby 开发环境。

此 Docker 容器正在运行 Debian 10 (Buster)。我已经测试了脚本,它运行正常:

sudo /usr/local/bin/ruby /workspaces/main.rb

我曾经crontab -e添加过 cron 作业:

* * * * * /usr/local/bin/ruby /workspaces/main.rb
* * * * *  sleep 30; /usr/local/bin/ruby /workspaces/main.rb

一开始根本没有syslog。所以我安装了 rsyslog,日志开始进入/var/log/syslog,但只有几个。与 cron 相关的都是关于我使用 crontab 所做的编辑:

May 21 14:29:56 cec3901197dc crontab[3347]: (vscode) LIST (vscode)
May 21 14:30:00 cec3901197dc crontab[3362]: (vscode) BEGIN EDIT (vscode)

我编辑/etc/rsyslog.conf并更改了:

#cron.* /var/log/cron.log

到:

cron.* /var/log/cron.log

然后我终止并重新启动了 rsyslogd 进程:

sudo kill -9 3056
sudo rsyslogd

我可以向系统日志发送一条测试消息并查看它是否正在运行:

logger test

查看/var/log/syslog我发现已添加相应的日志条目:

May 21 15:50:29 cec3901197dc vscode: test

我还可以看到 rsyslog 正在成功将 crontab 日志条目写入/var/log/cron.log

May 21 15:44:15 cec3901197dc crontab[16490]: (vscode) BEGIN EDIT (vscode)
May 21 15:46:27 cec3901197dc crontab[16490]: (vscode) END EDIT (vscode)

但我只看到这些 crontab 条目,没有看到有关正在执行的 cron 作业的信息。我猜我的作业可能配置不正确……我尝试了几种不同的变体,但都没有提供任何日志条目。

但是,即使它们配置不正确,cron 仍然不应该将它们产生的错误记录下来吗cron.log

我还需要做其他什么才能从 cron 获取更详细的消息吗?或者我可以更改命令以提供更详细的消息吗?

更新 - 5/21/21

我在本地 Ubuntu 安装上尝试了此操作。我必须以 root 身份登录sudo -i并添加到 root 的 crontab。这有效 - 我开始在文件夹中看到日志/var/log/

但是,在我的 VSC 容器上使用 root 不起作用。通过比较本地 Ubuntu 和 VSC 实例的日志记录,我怀疑问题在于 syslog 现在运行正常,而问题在于 cron 调度程序实际上并未运行...这就是为什么只有 crontab 相关条目出现在 syslog 中的原因。

为什么 cron 没有运行?

答案:默认情况下,Docker 容器不会启动 cron。cron从提示符运行将启动它并开始正确记录到/var/log/cron.log

但是,即使执行了 cron 作业,它仍然无法在 处创建适当的current_usersuser_changes文件/var/log/

现在配置状态

  1. 仍在使用 VSC Remote Containers Ruby Docker 容器。
  2. 已安装并启动rsyslogd
  3. 编辑/etc/rsyslog.conf以将 cron 相关日志重定向到cron.log(从 main syslog
  4. 终止并重新启动rsyslogd以确保获取最新的配置。
  5. 用于sudo -i访问 root。
  6. 以 root 身份添加 crontab 作业crontab -e
* * * * * ruby /workspaces/main.rb
* * * * * sleep 30; ruby /workspaces/main.rb
  1. 检查 cron 是否确实正在运行以下作业cron.log
May 21 18:41:01 cec3901197dc CRON[45188]: (root) CMD (sleep 30; ruby /workspaces/main.rb)
May 21 18:41:01 cec3901197dc CRON[45190]: (root) CMD (ruby /workspaces/main.rb)
  1. 检查是否current_usersuser_changes已更新,没有。
  2. 检查脚本是否可以在命令提示符下正确运行ruby /workspaces/main.rb。是的,运行正常。创建适当的文件。

所以现在我真的很困惑。 cron 作业正在运行 ruby​​ 脚本,但它没有创建文件。我可以自己运行 ruby​​ 脚本,它确实创建了文件。怎么回事?

答案1

这是那些存在多个问题导致 cron 作业无法成功运行的问题之一。当我解决一个问题时,又发现了一个又一个问题……

问题 1-3:运行 Visual Studio Code Remote-Containers 预构建的 Docker 容器

我喜欢 VSC Remote-Containers。他们做到了所以在本地机器上轻松启动开发环境,并且编辑体验无缝......除了有时,比如这种情况。

我(错误地)期望我的开发环境基本上像一个普通的 Linux 机器一样运行 - 但我错了。运行 Docker 容器时,有些东西会被删除,需要重新添加……如果不是,环境体验就不一样了。这就是在这种情况下发生的事情 -rsyslog没有安装,也cron没有运行。

为了解决这些问题,我做了以下事情:

  1. 已安装rsyslogsudo apt install rsyslog
  2. 进行编辑/etc/rsyslog.conf以便cron将相关作业保存到/var/log/cron.log(这不是绝对必要的,但使解析日志更容易)。
  3. 杀死 rsyslog:(sudo kill -9 3056你需要检查适当的 pid,简单的方法是使用ps aux | grep rsyslog
  4. 启动了 rsyslog:(sudo rsyslog为什么我要终止并重新启动?所以选择了最新的配置)
  5. 启动 cron:cron

问题 4:没有以 root 身份运行 cron 任务

我最初尝试使用默认用户(vscode,然后sudo运行命令)运行 cron 作业。但这样做行不通。我确信可能有办法让它工作(我很想听听),但我使用了 root:sudo -i

一旦进入 root 帐户,我就可以使用以下方式添加作业crontab -e

问题 5:未包含 Ruby 的完整路径

在我的本地 Ubuntu 机器上创建以下作业运行良好:

* * * * * ruby /workspaces/main.rb`
* * * * * sleep 30; ruby /workspaces/main.rb`

但在 VSC Debian 10 容器中它不起作用。所以我将 Ruby 的路径设为绝对路径:

* * * * * /usr/local/bin/ruby /workspaces/main.rb
* * * * * sleep 30; /usr/local/bin/ruby /workspaces/main.rb

一旦我做出了这个改变,事情就开始发挥作用了。

相关内容