该at
命令有一个奇怪的行为,我找不到原因。
故事 -三天后,我需要在特定时间发送电子邮件,给某人一个惊喜。我将无法监控一切是否正常运行,因为我将在飞机上待大约 20 个小时。一切都会完美运行。 :-)
脚本 -我正在使用该at
命令对作业进行排队以供以后执行。我创建了一堆文件(每个邮件一个),格式如下:
mail1.txt 的内容(示例)
This is a subject
This is a message...
... on several lines
这是我的脚本:
#!/bin/bash
function sendit {
FROM_MAIL="[email protected]"
RCPT_MAIL="[email protected]"
SUBJECT=$(head -n 1 $1)
MESSAGE=$(tail -n +2 $1)
echo -e "$MESSAGE" |mail -s "$SUBJECT" -r $FROM_MAIL $RCPT_MAIL
}
# Note, time is EDT, it correspond to the date of my server
sendit mail1.txt|at 02:37 May 03
sendit mail2.txt|at 02:38 May 03
sendit mail3.txt|at 03:13 May 03
[...]
然后我运行我的脚本:
$ bash script.sh
warning: commands will be executed using /bin/sh
job 35 at Tue May 3 02:37:00 2016
warning: commands will be executed using /bin/sh
job 36 at Tue May 3 02:38:00 2016
warning: commands will be executed using /bin/sh
job 37 at Tue May 3 03:13:00 2016
[...]
一切看起来都很完美,然而,当我几分钟后查看邮件时,我发现有些邮件已经发送了......(似乎是随机的)
任何想法?
答案1
将|
左侧进程的标准输出发送到右侧命令。您的 sendit 函数实际上发送了邮件,但不会在标准输出上产生太多输出(我实际上不记得 的输出是什么mail
),因此输入at
不是发送邮件的命令。
考虑一下作为用户,您通常会at
这样使用:
at 02:37 May 03 # This will read commands from stdin until Ctrl/D
sendit mail1.txt
Ctrl/D
您还可以sendit
通过编程方式将命令传送到at
:
echo 'sendit mail1.txt' | at 02:37 May 03
答案2
我想你的意思是echo sendit mail1.txt|at 02:37 May 03
。