我在Alpine Linux上運行非root用戶的crontab文件有一段令人討厭的時間。爲什麼crond無法在alpine linux上運行非root 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,一切工作沒關係,根。
如果我檢查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等高山容器,但大多數人不通過的麻煩去讓他們的高山容器運行非根。
有沒有人有任何進一步的建議,以幫助調試?
這是一個開發問題(DevOps)。我正在開發一個碼頭集裝箱,並且碼頭集裝箱正在使用Alpine。 請參閱堆棧溢出其他與docker相關的問題的數量巨大:https://stackoverflow.com/search?q=docker –