Linux 中的前台任务调度类似于 Windows 的 Task Scheduler

You*_*eed 3 bash scripts automation schedule

我在 Windows 上有一个批处理应用程序,我每天在午夜运行。最近,我将其转换为 Linux 机器上的 Linux shell 脚本,并希望每天午夜类似地运行它。我的要求如下:-

  • 对于在前台运行的 shell 脚本 - 这是为了让我看到正在运行的进程的输出并在它失败时纠正/修复问题。
  • 与 Windows 任务调度程序的工作方式类似,我想要一个可以运行的脚本列表,并且可以启用/禁用这些列表。
  • (可选)理想情况下,可以通过编程方式修改 Task Scheduler 等效项。这将允许我根据已运行任务的结果禁用/启用任务。

这是可行的吗?我已经看到下面的链接,但它们不包含我的用例所需的所有标准。如果下面的链接之一是正确的方法,那么示例会非常有帮助。

mch*_*hid 8

要在午夜运行 cron 作业,您可以在命令或脚本路径的前面加上:

0 0 * * *
Run Code Online (Sandbox Code Playgroud)

例如,要运行/home/youssif/myscript ,您可以使用:

0 0 * * /home/youssif/myscript
Run Code Online (Sandbox Code Playgroud)

在您的 crontab 文件中。


要编辑 crontab 文件,请使用crontab -e以当前用户身份运行命令。或者,如果您绝对需要以 root 身份运行该命令,您可以运行sudo crontab -e以编辑您的 crontab 文件。


要在终端中运行该命令(如果您以 root 身份运行该命令不是一个好主意),您需要指定要在您的命令或脚本中使用的显示。为此,假设您$DISPLAY:0(默认),您可以使用以下变量作为命令前缀:

DISPLAY=:0
Run Code Online (Sandbox Code Playgroud)

此外,终端通常会在命令执行后关闭,但您可以在 xterm 中使用 hold 选项来保持终端打开。

因此,要echo "hello world"在午夜在终端中运行,您的命令将如下所示:

0 0 * * DISPLAY=:0 xterm -hold -e 'echo "hello world"'
Run Code Online (Sandbox Code Playgroud)

或运行您的脚本:

0 0 * * DISPLAY=:0 xterm -hold -e '/home/youssif/myscript'
Run Code Online (Sandbox Code Playgroud)

但是,检查 cronjob 输出的标准方法是将终端输出重定向到您可以稍后查看的文件。

例如,要将终端输出重定向到文件,/home/youssif/helloworld.log您可以在 crontab 文件中使用以下行:

0 0 * * echo "hello world" > /home/youssif/helloworld.log
Run Code Online (Sandbox Code Playgroud)

或者,您也可以使用该tee命令重定向输出,如下所示:

0 0 * * echo "hello world" | tee /home/youssif/helloworld.log
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用cat命令查看文件的内容:

cat /home/youssif/helloworld.log
Run Code Online (Sandbox Code Playgroud)

这样,命令可以在后台运行,但您仍然可以检查输出。


要根据已运行任务的结果禁用/启用任务,我认为这对于单独的问题确实更合适。我相信您的答案将涉及在 bash 脚本中使用“if then else”语句。


编辑:

正如@Tcooper 指出的那样,我们必须添加2>&1以重定向所有输出,包括错误消息,因此您可能希望使用以下内容:

0 0 * * echo "hello world" 2>&1 > /home/youssif/helloworld.log
Run Code Online (Sandbox Code Playgroud)

或者

0 0 * * echo "hello world" 2>&1 | tee /home/youssif/helloworld.log
Run Code Online (Sandbox Code Playgroud)

  • `0 0 * * echo "hello world" > /home/youssif/helloworld.log` 每天都会清除日志。使用 `>>` 它将每天将内容添加到文件的末尾。 (3认同)
  • 可能值得一提的是,如果您希望所有输出都转到您的日志文件,而不是其他任何地方,请添加“2>&1”,其中 2 是标准错误输出,1 是标准输出。因此,将错误发送到标准输出并将所有内容输出到您的日志文件中。或者,对于两个不同的日志文件:“2>err_log.txt 1>cron_log.txt” - 不将其声明为 cron 错误的默认系统电子邮件,我发现...烦人,至少与使用日志文件相比 (2认同)
  • @AL 是的,我决定这样做,因为它更像是打开一个终端并为单个会话提供输出。我认为最好在日志前添加一个日期,这似乎会使已经很复杂的答案复杂化。 (2认同)

van*_*ium 5

所有这些要求都可以轻松满足。Linux 中调度作业的传统方法是crontab。在 Linux 中安排作业的“现代”方法是systemd. crontabUbuntu 上继续受支持。

您的需求1:不寻常:您是否在午夜任务开始时在电脑前等待?否则,这就是 Linux 中使用日志文件的原因。然后系统管理员可以在白天检查日志以检查事情的进展情况。

如果需要,可以在图形终端模拟器中启动作业。然而,这要求您随时登录,从安全角度来看这可能不太理想。

crontab和/或systemd满足要求2systemd list-units您可以在文件的输出或文件中看到作业列表crontab。您可以通过命令或通过在任务前面systemd删除/添加注释符号或完全删除该行来启用/禁用/删除。#

要求 3可以轻松编写脚本。后续作业可以读取前一个作业已完成的操作,并采取相应的操作。