- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 Alpine Linux 上运行非根 crontab 文件时遇到了麻烦。
我已经浏览了另外两个与 cron 相关的帖子,但我没有答案:
https://askubuntu.com/questions/23009/why-crontab-scripts-are-not-working
https://serverfault.com/questions/449651/why-is-my-crontab-not-working-and-how-can-i-troubleshoot-it
这是设置。
我的 crontab 是这样的:
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin
SHELL=/bin/bash
* * * * * /opt/monitor/monitor.sh >> /var/log/monitor.log 2>&1
0 3 * * * /opt/monitor/monitor-log-clean.sh >> /var/log/monitor.log 2>&1
我的 Dockerfile 现在有点乱,但这只是因为我一直在拼命尝试解决这个问题。它看起来像这样。简而言之,我为 crontab -e 添加 SUID 以像其他用户一样工作,我创建我的用户,我导入我的 crontab 文件,然后我为我能想到的一切提供权限。
FROM alpine:3.5
# DEPENDENCY TO ALLOW USERS TO RUN crontab -e
RUN apk add --update busybox-suid
# I LIKE BASH
RUN apk --no-cache add bash bash-doc
RUN apk --no-cache add util-linux pciutils usbutils coreutils binutils findutils grep
#... lots of custom stuff ...
# CREATE USER
RUN adduser -S robuser && \
mkdir -p /home/robuser
# ADD ENTRY POINT
ADD src/entrypoint.sh /home/robuser/entrypoint.sh
# GIVE MY USER ACCESS
RUN mkdir /etc/cron.d
RUN echo "robuser" > /etc/cron.allow
RUN echo "" >> /etc/cron.allow
RUN chmod -R 644 /etc/cron.d
# ADD MY CRONTAB
RUN mkdir -p /var/spool/cron/crontabs
ADD ./src/crontab.conf /tmp/cloudwatch/crontab.conf
RUN crontab -u robuser /tmp/cloudwatch/crontab.conf
# DEBUG... GIVE MY USER ACCESS TO EVERYTHING
RUN chown -R robuser /etc/cron.d
RUN chmod -R 755 /etc/cron.d
RUN chown -R robuser /var/spool/cron
RUN chmod -R 744 /var/spool/cron
RUN chown robuser /var/spool/cron/crontabs
RUN chmod 744 /var/spool/cron/crontabs
RUN chown -R robuser /etc/crontabs
RUN chmod -R 744 /etc/crontabs
RUN chown robuser /etc/crontabs/robuser
RUN chmod -R 744 /etc/crontabs/robuser
RUN chmod 600 /var/spool/cron/crontabs/robuser
# ADD MY MONITORING PROGRAM
RUN mkdir -p /opt/monitor
ADD src/monitor /opt/monitor
RUN mkdir -p /opt/monitor/.tmp && \
chown -R robuser /opt/monitor && \
chmod -R 700 /opt/monitor
RUN touch /var/log/entrypoint.log && \
touch /var/log/monitor.log && \
touch /var/log/cron.log && \
touch /var/log/awslogs.log && \
chown -R robuser /var/log
USER robuser
ENTRYPOINT /home/robuser/entrypoint.sh
与此同时,我的 entrypoint.sh 中某处有这个。我将 cron 守护程序作为后台服务启动,并详细记录到 cron.log。我也尝试过指定 -d 0 以获得更多调试,但并没有真正向输出添加任何内容。
#!/bin/bash
crond -b -l 0 -L /var/log/cron.log
#... lots of other startup stuff ...
重要的一点:如果我不切换到 robuser,root 用户一切正常。
如果我检查 cron.log,它是空的:
crond: crond (busybox 1.25.1) started, log level 0
crond: wakeup dt=45
crond: wakeup dt=60
crond: wakeup dt=60
与此同时,/var/log/monitor.log 完全是空的(请参阅帖子开头的 crontab)。
所以 crond 没有打印任何错误。
我已经尝试了所有我能想到的调试方法。没有错误信息。它只是运行并且从不打印。一个很好的建议是简单地使用我的 crontab.. 但这也没有用:
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin
SHELL=/bin/bash
* * * * * touch /tmp/test.txt
我已经尝试搜索其他使用非 root 用户 cron 的 alpine 容器,但大多数人都没有经历让他们的 alpine 容器以非 root 用户运行的麻烦。
有没有人有任何进一步的建议来帮助调试这个?
最佳答案
cron
本身应该作为 root
运行,无论您要使用哪个用户来运行作业。
确实,当你运行时:
RUN crontab -u robuser /tmp/cloudwatch/crontab.conf
这将为用户 robuser
安装一个 crontab
。当 cron
从这个特定的 crontab
执行作业时,它会自动将用户切换到 robuser
。 但是,如果 cron
不是以 root
身份运行,它就不能那样切换用户,这就是为什么你需要运行 cron
作为根。
因此,要使 cron
在这里工作,您需要从 Dockerfile 中删除此指令:
USER robuser
请注意,一旦您解决了这个问题,您可能就不会脱离险境:如果您使用环境变量将 AWS 凭证传递给您的监控脚本(看起来您在这里使用的是 AWS),这不会不起作用,因为 cron
会在切换用户之前删除那些。这主要是 cron
中的一项安全功能,可避免环境变量泄露给非特权用户。
顺便说一句:我写了一个开源的 crontab runner,Supercronic ,专为容器用例而设计,它解决了这个问题(你可以作为非特权用户运行它就好了)。如果您对常规 cron
感到沮丧,您可以随时试一试。
关于linux - 为什么 crond 无法在 alpine linux 上运行非根 crontab?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44934762/
我们有几个聚合根,它们有两种主要的识别方法: 一个整数“键”,用作数据库中的主键(并通过引用聚合用作外键)以及应用程序内部的主键,并且无法通过公共(public)网络 API。 基于字符串的“id”,
据我所知,直到 angular 6 ,所有@Ngmodule 提供程序都在根注入(inject)器上注册并在主包中提供服务,即使只有延迟加载的模块使用它们。 唯一的异常(exception)是如果我们
我可以使用 创建文件 File directory = cw.getDir("media", Context.MODE_PRIVATE); //directory.mkdirs(); File b
我正在使用 Mavericks,XCode 5。 我想添加非根 URL 存储库例如svn://sources.xxx.com/xxx/xxx/xxx/xxx 我已经从XCode首选项->帐户尝试过,但
xmllint --xpath "//project" test.xml 失败了 4.0.0 但如果我像这样删除 xmlns 属性,则会成功: 4.0.0
我正在尝试从具有以下结构的深层链接打开 View Controller : # Regular navigation: AppDelegate -> A (root) -> B -> C # Deep
我正在尝试在标签栏内添加一个 Split View,由于 Split View不是 Root View ,因此它无法正确获取旋转通知,因此永远不会调用委托(delegate)的方法来添加按钮到详细 V
我正在关注 this document为我的 gunicorn 服务器设置 Systemd 套接字和服务。 Systemd 将 gunicorn 作为 www-data 启动 gunicorn for
我正在使用 wiringPi2-python 将覆盆子 GPIO 引脚从低电平切换到高电平,然后再切换回来。一切正常,但在它切换 pin 的值后立即抛出 Segmentation fault 并且程序
文档: https://learn.microsoft.com/en-us/graph/api/driveitem-createuploadsession?view=graph-rest-1.0 我可
我是一名优秀的程序员,十分优秀!