【问题标题】:Why does my cron(tinycron) execute a command twice sometimes?为什么我的 cron(tinycron) 有时会执行两次命令?
【发布时间】:2020-07-07 13:13:15
【问题描述】:

由于一些安全问题,我使用tinycron 而不是 cron。

我用一个简单的 python 文件进行了测试。

python.py:

import time
print(time.ctime())

Dockerfile:

FROM MyBaseImage:Centos7

USER root

RUN yum -y update \
    && yum -y install python3 vim \
    && yum clean all \
    && rm -rf /var/cache/yum

RUN pip3 install requests

RUN localedef -c -i en_US -f UTF-8 en_US.UTF-8 && \
  localedef -c -i en_US -f UTF-8 en_US && \
  localedef -c -i ko_KR -f UTF-8 ko_KR.UTF-8 && \
  localedef -c -i ko_KR -f UTF-8 ko_KR

RUN echo "LANG=en_US.utf8" > /etc/locale.conf

# install tinycron
RUN curl -sLo tinycron https://github.com/bcicen/tinycron/releases/download/v0.3/tinycron-0.3-linux-amd64 \
    && chmod +x tinycron \
    && mv tinycron /usr/local/bin/

WORKDIR /app
COPY . /app

CMD /usr/local/bin/tinycron '*/5 * * * * * *' python3 /app/test.py

这应该每五秒打印一次。

但是,它有时会打印两次。

✗ docker run --rm -it --name=test tiny2
Tue Jul  7 12:02:15 2020
Tue Jul  7 12:02:20 2020
Tue Jul  7 12:02:25 2020
Tue Jul  7 12:02:30 2020
Tue Jul  7 12:02:34 2020 ###
Tue Jul  7 12:02:35 2020 ###
Tue Jul  7 12:02:40 2020
Tue Jul  7 12:02:45 2020
Tue Jul  7 12:02:50 2020
Tue Jul  7 12:02:55 2020
Tue Jul  7 12:03:00 2020
Tue Jul  7 12:03:04 2020 ###
Tue Jul  7 12:03:05 2020 ###

我检查了容器,并确认只有一个 cron 进程。

➜  ~ docker exec -it test /bin/bash
[root@ce614b03b559 app]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 12:02 pts/0    00:00:00 /usr/local/bin/tinycron */5 * * * * * * python3 /app/test.py
root        14     0  0 12:02 pts/1    00:00:00 /bin/bash
root        30    14  0 12:02 pts/1    00:00:00 ps -ef

这是什么原因造成的??

我的真实代码必须每分钟运行一次 python 代码(发送电子邮件),而且它也会执行两次。

任何想法表示赞赏:)

【问题讨论】:

  • here
  • @zr0gravity7 是的,我已经检查了帖子,但没有帮助。只有一个用户,只有一个进程,没有符号链接或自调用。问题是它不是每次都执行两次。

标签: docker cron


【解决方案1】:

这并没有给出原因,但我以某种方式解决了。

我用flock

flock 似乎在启动进程之前会检查锁定文件,并防止重复进程。

当我使用相同的test.py 文件时,flock 没有帮助,因为test.py 非常简单,以至于12:02:34 进程在12:02:35 进程开始之前立即结束。

但通常,一个过程需要几秒钟(至少对我来说)。

所以,我编辑了test.py 文件,添加sleep 如下:

import time
time.sleep(1)# wait for a second
print(time.ctime())

测试结果

  • CMD /usr/local/bin/tinycron '*/5 * * * * * *' python3 /app/test.py
✗ docker run --rm -it --name=test tiny2
Tue Jul  7 14:01:21 2020
Tue Jul  7 14:01:26 2020
Tue Jul  7 14:01:31 2020
Tue Jul  7 14:01:35 2020
Tue Jul  7 14:01:36 2020
Tue Jul  7 14:01:41 2020
Tue Jul  7 14:01:46 2020
Tue Jul  7 14:01:51 2020
Tue Jul  7 14:01:56 2020
Tue Jul  7 14:02:01 2020
Tue Jul  7 14:02:05 2020
Tue Jul  7 14:02:06 2020
Tue Jul  7 14:02:11 2020
  • CMD /usr/local/bin/tinycron '*/5 * * * * * *' flock -w 0 /mylock.lock python3 /app/test.py
✗ docker run --rm -it --name=test tiny2
Tue Jul  7 14:02:26 2020
Tue Jul  7 14:02:31 2020
[tinycron] job failed exit status 1
Tue Jul  7 14:02:35 2020
Tue Jul  7 14:02:41 2020
Tue Jul  7 14:02:46 2020
Tue Jul  7 14:02:51 2020
Tue Jul  7 14:02:56 2020
Tue Jul  7 14:03:01 2020
[tinycron] job failed exit status 1
Tue Jul  7 14:03:05 2020
Tue Jul  7 14:03:11 2020

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 2021-07-08
    • 2014-07-23
    • 2013-01-27
    • 1970-01-01
    • 2010-10-21
    • 2013-09-02
    相关资源
    最近更新 更多