Alpine Linux에서 루트가 아닌 crontab 파일을 실행하는 데 문제가 있습니다.
다른 크론 관련 게시물 두 개를 읽었지만 답변이 없습니다.
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 ...
중요한 점: 전환하지 않으면강도,루트로서 모든 것이 잘 작동합니다..
내가 확인해 보면기획일지, 이는 매우 비어 있습니다.
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
루트가 아닌 cron을 사용하여 다른 알파인 컨테이너를 검색해 보았지만 대부분의 사람들은 루트가 아닌 알파인 컨테이너를 실행하는 문제를 겪지 않습니다.
이 문제를 디버깅하는 데 도움이 되는 추가 제안 사항이 있는 사람이 있습니까?