docker - 来自主机的容器内的 Cron 任务
问题描述
我正在尝试从主机的容器内执行 cron 任务,但没有运气。从主机我添加以下行crontab -e
* * * * * docker exec -it sample_container bash -c 'touch /selected/directory/temp$(date +%H-%M)'
但这不起作用。有趣的是,当我在 crontab 之外独立运行命令时,它正在成功执行。谁能解释我在这里错过了什么?
解决方案
注意:当使用 cron 调试此类问题时,您应该在本地系统邮件中查找错误,或者通过添加MAILTO=yourmail@yourdomain.com
到您的 crontab 文件顶部将错误重定向到您的真实邮件。
您的 crontab 命令有 2 个问题
TLDR;固定的 cron 表达式
* * * * * docker exec sample_container bash -c 'touch /selected/directory/temp$(date +\%H-\%M)'
% 在 crontab 中有特殊含义
从man -s 5 crontab
命令中的百分号 (
%
),除非使用反斜线 (\
) 转义,否则将更改为换行符,并且第一个之后的所有数据%
都将作为标准输入发送到命令。
所以你需要%
在你的日期格式字符串中转义这些标志
Cron 不分配 tty
Cron 不分配 tty,而您在执行命令时尝试使用一个(即-t
选项 to docker exec
)。因此,该命令将失败并出现错误the input device is not a TTY
无论如何,您不需要进行交互 ( -i
) 也不需要为此命令分配 tty 来完成它的工作,因此您必须放弃这些选项才能从 cron 启动它。
推荐阅读
- azure-devops - Azure DevOps Server 2019 Build 已排队但未启动
- ios - SwiftUI - 单击 NavigationLink 时触发其他操作
- java - 是否有可能将多个设备 LatLng 与 1 个设备 LatLng 进行比较?
- flutter - 如何从列表中获取特定的 DocumentSnapshot
- github - GitHub 删除的文件正在抛弃语言统计信息
- c# - 从 JSON 中删除附加文本
- react-native - 在 createStackNavigator() 之前执行代码
- java - 检查 Firebase 实时数据库中是否存在字段
- amazon-web-services - 调用 UpdateService 操作时的 AWS ECS InvalidParameterExcpetion
- kotlin - 为什么此代码没有将所有大写字母替换为小写字母并将所有小写字母替换为大写字母?