(我发现了这个问题,这是多个问题...我将其保留原样,并在回答这个问题时解释我解决的过程)
我正在编写一个以 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_users
或user_changes
文件/var/log/
。
现在配置状态
- 仍在使用 VSC Remote Containers Ruby Docker 容器。
- 已安装并启动
rsyslogd
。 - 编辑
/etc/rsyslog.conf
以将 cron 相关日志重定向到cron.log
(从 mainsyslog
) - 终止并重新启动
rsyslogd
以确保获取最新的配置。 - 用于
sudo -i
访问 root。 - 以 root 身份添加 crontab 作业
crontab -e
:
* * * * * ruby /workspaces/main.rb
* * * * * sleep 30; ruby /workspaces/main.rb
- 检查 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)
- 检查是否
current_users
或user_changes
已更新,没有。 - 检查脚本是否可以在命令提示符下正确运行
ruby /workspaces/main.rb
。是的,运行正常。创建适当的文件。
所以现在我真的很困惑。 cron 作业正在运行 ruby 脚本,但它没有创建文件。我可以自己运行 ruby 脚本,它确实创建了文件。怎么回事?
答案1
这是那些存在多个问题导致 cron 作业无法成功运行的问题之一。当我解决一个问题时,又发现了一个又一个问题……
问题 1-3:运行 Visual Studio Code Remote-Containers 预构建的 Docker 容器
我喜欢 VSC Remote-Containers。他们做到了所以在本地机器上轻松启动开发环境,并且编辑体验无缝......除了有时,比如这种情况。
我(错误地)期望我的开发环境基本上像一个普通的 Linux 机器一样运行 - 但我错了。运行 Docker 容器时,有些东西会被删除,需要重新添加……如果不是,环境体验就不一样了。这就是在这种情况下发生的事情 -rsyslog
没有安装,也cron
没有运行。
为了解决这些问题,我做了以下事情:
- 已安装
rsyslog
:sudo apt install rsyslog
- 进行编辑
/etc/rsyslog.conf
以便cron
将相关作业保存到/var/log/cron.log
(这不是绝对必要的,但使解析日志更容易)。 - 杀死 rsyslog:(
sudo kill -9 3056
你需要检查适当的 pid,简单的方法是使用ps aux | grep rsyslog
- 启动了 rsyslog:(
sudo rsyslog
为什么我要终止并重新启动?所以选择了最新的配置) - 启动 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
一旦我做出了这个改变,事情就开始发挥作用了。