我想将at守护程序(atd
)放在单独的docker容器中,以作为独立于外部环境的调度程序服务运行。
我可以在atd
和Dockerfile
之后运行docker-compose.yml
:
$ cat Dockerfile
FROM alpine
RUN apk add --update at ssmtp mailx
CMD [ "atd", "-f" ]
$ cat docker-compose.yml
version: '2'
services:
scheduler:
build: .
working_dir: /mnt/scripts
volumes:
- "${PWD}/scripts:/mnt/scripts"
但是问题是:
1)没有内置选项可将atd
日志重新定向到/proc/self/fd/1
,以通过docker logs
命令显示它们。 at
仅具有-m
选项,该选项将邮件发送给用户。
是否可以将at
从用户邮件重定向到/proc/self/fd/1
(也许有一些编译标志)?
2)现在,我通过docker-compose exec scheduler at -f test.sh now + 1 minute
之类的命令添加新任务。这是个好方法吗?我认为一种更好的方法是找到一个文件,其中at
存储一个队列,将该文件添加为卷,在外部进行更新,并在文件更改后仅发送docker restart
。
但是我找不到at
在高山linux上的数据存储位置(我just found /var/spool/atd/.SEQ
在哪里存储上一份作业的ID)。有人知道at
在哪里存储数据吗?
也很高兴听到有关at
dockerization的任何建议。
UPD 。我发现at
的数据存储在高山的/var/spool/atd
文件夹中。当我通过at
命令创建任务时,它将在此处创建名称为a000040190a2ff
且内容为
#!/bin/sh
# atrun uid=0 gid=0
# mail root 1
umask 22
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; export PATH
HOSTNAME=e605e8017167; export HOSTNAME
HOME=/root; export HOME
cd /mnt/scripts || {
echo 'Execution directory inaccessible' >&2
exit 1
}
#!/usr/bin/env sh
echo "Hello world"
UPD2 :运行at
与不使用-m
选项之间的区别是生成脚本的第三个字符串
带有-m
选项:
#!/bin/sh
# atrun uid=0 gid=0
# mail root 1
...
没有-m
:
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
...
将向用户邮寄标准错误和他的标准输出 命令(如果有)。邮件将使用以下命令发送 / usr / sbin / sendmail
和
-m
作业完成后,即使没有邮件发送给用户 输出。
我尝试运行时间表简单的Hello World脚本,发现没有发送邮件:
# mail -u root
No mail for root