Linux 如何以非root用户身份运行cron作业并记录作业';谁的产量?
声明: 如果服务可以在没有权限的情况下运行,请使用“用户”更改为非根用户 在Linux 如何以非root用户身份运行cron作业并记录作业';谁的产量?,linux,docker,cron,alpine,Linux,Docker,Cron,Alpine,声明: 如果服务可以在没有权限的情况下运行,请使用“用户”更改为非根用户 在cron的情况下,这似乎并不实用,因为cron需要根权限才能正常工作。但是,cron运行的可执行文件不需要root权限。因此,我以root用户的身份运行cron本身,但通过crontab-u命令调用crontab脚本以非root用户的身份运行可执行文件(在本例中,我编写了一个简单的Python FTP下载脚本) cron/Docker的可交互性和社区体验似乎仍处于初级阶段,但有一些非常好的解决方案。利用从中收集到的经验教
cron
的情况下,这似乎并不实用,因为cron
需要根权限才能正常工作。但是,cron
运行的可执行文件不需要root权限。因此,我以root
用户的身份运行cron
本身,但通过crontab-u
命令调用crontab
脚本以非root用户的身份运行可执行文件(在本例中,我编写了一个简单的Python FTP下载脚本)
cron/Docker的可交互性和社区体验似乎仍处于初级阶段,但有一些非常好的解决方案。利用从中收集到的经验教训和优秀的帖子,我来到了一个Dockerfile,看起来像这样:
FROM python:3.7.4-alpine
RUN adduser -S riptusk331
WORKDIR /home/riptusk331
... boilerplate not necessary to post here ...
COPY mycron /etc/cron.d/mycron
RUN chmod 644 /etc/cron.d/mycron
RUN crontab -u riptusk331 /etc/cron.d/mycron
CMD ["crond", "-f", "-l", "0"]
而mycron
文件只是一个每分钟运行一次的简单python执行
* * * * * /home/riptusk331/venv/bin/python3 /home/riptusk331/ftp.py
这工作得非常好,但我不确定这里到底是如何处理日志记录的。我没有看到任何保存在/var/log/cron
中的内容。我可以在我的终端上看到cron
和ftp.py
的输出,如果我在Kitematic中调出它,也可以在容器日志中看到。但我不知道这里到底发生了什么
因此,我的第一个问题是:这里是如何处理日志记录和输出的(在cron作业之后没有任何重定向),这个实现方法是否正常和安全?
VonC对的回答建议将/proc/1/fd/12>/proc/1/fd/2
附加到cron作业中,以将输出重定向到Docker的stdout
和stderr
。这就是我俩都有点困惑,并遇到麻烦的地方
我的crontab文件现在看起来像这样
* * * * * /home/riptusk331/venv/bin/python3 /home/riptusk331/ftp.py > /proc/1/fd/1 2>/proc/1/fd/2
riptusk331
。因此,我没有根访问权限,出现以下错误:Alpine基础映像基于一个名为的紧凑工具集,当您在这里运行
crond
时,您得到的是BusyBox cron,而不是任何其他实现。它有点稀疏,但是如果你看一下(在C中),你会发现当它运行一个作业时,根本没有任何重定向(请参阅非sendmail版本的start\u one\u job
);作业的stdout和stderr是crond的stdout和stderr。在Docker中,由于crond是容器的主进程,因此它又成为容器的输出流
docker日志中显示的任何内容都定义为转到stdout或stderr或容器的主进程。如果这个cron实现将作业的输出直接写在那里,那么利用它不会有任何错误或不安全
在较重的容器编排系统中,有一些方法可以按计划运行容器(Kubernetes CronJobs,Nomad periodic jobs)。您可能会发现,设置一个运行作业一次然后退出的容器,然后设置主机的cron来运行您的容器(必须以root用户身份运行)更容易、更一致。您需要允许CAP_SETGID以用户身份运行crond
,如果将其设置为所有busybox二进制文件,则可能存在安全风险,但您可以使用dcron
包而不是busybox的内置crond
,并仅在该程序上设置CAP_SETGID
。以下是您需要为Alpine添加的内容,使用riptusk331
作为运行用户
USER root
# crond needs root, so install dcron and cap package and set the capabilities
# on dcron binary https://github.com/inter169/systs/blob/master/alpine/crond/README.md
RUN apk add --no-cache dcron libcap && \
chown riptusk331:riptusk331 /usr/sbin/crond && \
setcap cap_setgid=ep /usr/sbin/crond
USER riptusk331
@又是jww?(). 这是100%关于堆栈溢出的主题,我以前已经回答过这样的问题。多年来,@jww但是,像往常一样,感谢你的节制努力。今天我已经看到了这些是如何在短时间内完成的()。@jww-很抱歉…我在搜索中看到了足够多关于这个主题的对话,所以我认为这是可以的…感觉在灰色区域。@riptusk331这不是灰色区域。哇,谢谢-没有意识到这是cron的BusyBox实现。知道这一点非常有帮助。如果我确实想维护一个只有cron的日志文件,有没有最佳实践方法?正如我在其他一些答案中所看到的,使用tail
会导致它成为容器的主要进程,而不是cron
USER root
# crond needs root, so install dcron and cap package and set the capabilities
# on dcron binary https://github.com/inter169/systs/blob/master/alpine/crond/README.md
RUN apk add --no-cache dcron libcap && \
chown riptusk331:riptusk331 /usr/sbin/crond && \
setcap cap_setgid=ep /usr/sbin/crond
USER riptusk331