我在 Windows 上有一个批处理应用程序,我每天午夜都会运行它。最近,我在 Linux 机器上将其转换为 Linux shell 脚本,并希望每天午夜同样运行它。我的要求如下:-
- 对于在前台运行的 shell 脚本 - 这是为了允许我查看正在运行的进程的输出,并在失败时进行更正/修复。
- 与 Windows 任务计划程序的工作方式类似,我希望有一个可以运行的脚本列表,并且可以启用/禁用这些列表。
- (可选)理想情况下,可以通过编程修改任务计划程序等效项。这将允许我根据已运行任务的结果禁用/启用任务。
这可行吗?我看过下面的链接,但它们不包含我用例所需的所有标准。如果下面的某个链接是正确的选择,那么示例会非常有用。
答案1
在午夜运行 cron 作业,您可以在命令或脚本路径前加上前缀:
0 0 * * *
例如,要运行/home/youssif/myscript
,您可以使用:
0 0 * * /home/youssif/myscript
在您的 crontab 文件中。
编辑 crontab 文件,使用crontab -e
以当前用户身份运行该命令。或者,如果您确实需要以 root 身份运行该命令,您可以运行sudo crontab -e
来编辑您的 crontab 文件。
要在终端中运行该命令(如果以 root 身份运行该命令,则不是一个好主意),您需要在命令或脚本中指定要使用的显示。为此,假设您的$DISPLAY
是:0
(默认),您可以在命令前加上以下变量:
DISPLAY=:0
此外,终端通常会在命令执行后关闭,但您可以使用 xterm 的 hold 选项保持终端开放。
echo "hello world"
因此,要在午夜在终端中运行,你的命令看起来如下:
0 0 * * DISPLAY=:0 xterm -hold -e 'echo "hello world"'
或者运行你的脚本:
0 0 * * DISPLAY=:0 xterm -hold -e '/home/youssif/myscript'
但是,检查 cronjob 输出的标准方法是将终端输出重定向到您稍后可以查看的文件。
例如,要将终端输出重定向到文件,/home/youssif/helloworld.log
您可以在 crontab 文件中使用以下行:
0 0 * * echo "hello world" > /home/youssif/helloworld.log
或者,您也可以使用tee
命令来重定向输出,如下所示:
0 0 * * echo "hello world" | tee /home/youssif/helloworld.log
最后可以使用命令cat
查看文件的内容:
cat /home/youssif/helloworld.log
这样,命令可以在后台运行,但您仍然可以检查输出。
根据已运行任务的结果禁用/启用任务,我认为这确实更适合单独提问。我相信您的答案将涉及在 Bash 脚本中使用“if then else”语句。
编辑:
作为@Tcooper 指出,我们必须添加2>&1
重定向所有输出,包括错误信息因此你可能想使用类似这样的方法:
0 0 * * echo "hello world" 2>&1 > /home/youssif/helloworld.log
或者
0 0 * * echo "hello world" 2>&1 | tee /home/youssif/helloworld.log
答案2
所有这些要求都可以轻松满足。在 Linux 中调度作业的传统方式是crontab
。在 Linux 中调度作业的“现代”方式是systemd
。Ubuntucrontab
继续支持这种方式。
你的要求 1:是不寻常的:任务开始时,您是否在午夜时分在计算机旁等待?否则,这就是 Linux 中使用日志文件的原因。然后,系统管理员可以在白天检查日志,以检查事情进展如何。
如果需要,可以在图形终端仿真器中启动作业。但是,这要求您随时登录,从安全角度来看这可能不太理想。
crontab
和/或systemd
满足要求 2systemd list-units
。您可以在输出或文件中看到作业列表crontab
。您可以通过命令启用/禁用/删除,或者在任务前面systemd
删除/添加注释符号,或者完全删除该行。#
要求 3可以轻松编写脚本。后续作业可以读取前一个作业所完成的操作,并采取相应行动。
答案3
我必须强调,您提出的一些问题非常不合常规,而且有充分的理由。例如,在前台运行计划任务意味着一旦输出超出终端的回滚缓冲区(即存储“输出历史记录”的容量),输出就会丢失。这就是为什么将输出发送到日志文件比直接在终端中显示更为常规的原因,我绝对建议您在这里坚持这种惯例。
话虽如此...超慢性是一个任务调度程序,您可以以普通(非 root)用户的身份在前台运行它,它能够将输出直接记录到终端。它读取一个类似于 crontab 的文件,您可以在其中指定要运行的脚本列表以及运行这些脚本的时间,并且可以安排一些自动化过程来编辑该文件并向 supercronic 过程发出信号,以便它获取更改。所以它似乎满足了您的所有要求。