我有一个 shell 脚本任务脚本它需要在每天的特定时间在 Unix 后台运行。
我知道nohup
在后台运行脚本很有用。但我担心如何安排此脚本在每天的指定时间运行。
笔记:我不是root用户。我没有crontab
命令权限。
任何帮助将不胜感激。
答案1
正确的方法是使用 Crontab - 如果您无权访问 crontab,您真的应该与管理员联系 - 他们可能不希望您运行计划作业。也就是说,在您说没有 crontab 命令的权限之前,请尝试运行“crontab -e” - 每个用户都有自己的 cron 文件,而 crontab - 将尝试编辑您的文件。(我注意到,当我以用户身份单独运行 crontab 时,它会冻结)
通过在作业后面附加“&”字符,您可以让几乎任何作业在后台运行。我反对这样做,但您可以在 while 循环中编写一个脚本,该脚本检查时间,然后等待一分钟,再次检查等,如果匹配则执行命令。您可以使用 & 运行此脚本以在后台运行它。您还可能因破坏系统而惹上麻烦……
另一个要查找的命令是“screen”。这允许您将终端与控制台连接和分离 - 这是一种在后台运行某些程序的有效方式,但能够看到并与之交互(您可以screen,然后在前台执行程序,然后从screen分离,稍后重新连接)
编辑
每分钟检查一次时间并在适当的时候运行命令的脚本:
#! /bin/bash
RUNAT="07:54"
while [ 1 ]
do
DATE=`/bin/date +%H:%M`
if [ $DATE. = $RUNAT. ]
then
/path/to/script.sh
fi
sleep 60
done
将其保存为(例如)mycron.sh,chmod 755 mycron.sh 以便执行,修改 RUNAT 行以在您希望脚本运行时触发,然后将该脚本作为 mycron.sh 执行,以便它在后台运行。
此脚本不会导致任何堆栈溢出,因为它每天仅执行一次命令,它不会“自我链接”
答案2
只要您有权访问在(不太可能,如果计划任务虽然不太实用,但值得一试)你可以模拟简单的 cron 任务。最简单的方法是在在给定的时间运行脚本,并让脚本执行在当必须运行时,再次运行。
在我的示例中,脚本仅写入其上次运行的时间戳并进行一分钟的计时:
/tmp$ cat cronbyat.sh
#!/bin/sh
echo "last run: `date +%Y%m%d-%H%M%S`" >> /tmp/cronbyat.log
echo "/tmp/cronbyat.sh" | at now + 1 minute
/tmp$ echo "/tmp/cronbyat.sh" | at now + 1 minute
warning: commands will be executed using /bin/sh
job 5 at Mon Feb 15 09:00:00 2016
/tmp$ tail -f /tmp/cronbyat.log
last run: 20160215-090000
last run: 20160215-090100
last run: 20160215-090200
last run: 20160215-090301
last run: 20160215-090400
^C
/tmp$ atq
10 Mon Feb 15 09:05:00 2016 a lx
/tmp$ atrm 10
/tmp$ atq
/tmp$
当不再需要该脚本时,必须终止其当前作业,如最后几行所示。不幸的是,如果由于任何原因错过运行,链条就会断裂。因此,应该给出并检查某种反馈。