Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何以非root用户身份运行cron作业并记录作业';谁的产量?_Linux_Docker_Cron_Alpine - Fatal编程技术网

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
  • 没有任何重定向的输出似乎已经进入stdout/stderr,但我不能完全确定。我只知道它出现在我的终端上。那么,为什么需要这种重定向呢

  • 当我添加此重定向时,我会遇到许可问题。回想一下,这个crontab被称为非root用户
    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