如何使用 crontab 启动脚本

如何使用 crontab 启动脚本

我已经创建了一个脚本(我已经测试过它是否有效)并且我想使用 crontab 在我的 PC 每次重启时启动它。

我创建了这些脚本测试文件只是为了好玩而且非常简单:

#!/bin/bash
while true; do
echo "HELLO WORLD!"
done

它只是打印“Hello World”直到有人使用 ctrl+c,它位于目录 /home/myuser/Scripts 中。

因此我打开 crontab -e 并添加

@reboot /home/myuser/Scripts/test.sh

我重新启动了机器,但什么也没发生,而如果我通过取消 ./test.sh 手动启动脚本,它就可以正常工作。

我不知道出了什么问题......

请你帮助我好吗?

答案1

cronjob 可能正在运行 - 但是您没有提供其输出 (stdout) 的重定向,因此它无处显示。cron 启动的任务负责自己的日志记录/输出 - cron 不提供输出重定向功能。

您可以让 cron 作业启动一个终端,然后在其中运行您的脚本;这里有一个示例:

首先使用 crontab -e 设置 crontab(以您希望脚本运行的用户身份运行)。

以标准方式添加作业;为了测试目的,我每分钟运行一次这个作业:

* * * * * /home/argonauts/scripts/test.sh

在脚本中,您需要明确设置显示并启动终端。以下是我在 test.sh 中使用的内容:

#!/bin/bash
DISPLAY=:0 xterm -hold -e bash -c "while true; do echo Hello World!; done"  &
DISPLAY=:0 konsole --noclose -e bash -c "/home/argonauts/scripts/test2.sh" &

第一个命令启动一个 xterm 窗口,运行 Hello World 循环。该-hold参数在命令执行后保持窗口打开(我猜想在这个特定情况下是 true == false...)。

第二条命令启动 konsole 终端并在其中执行第二个脚本。为了检查上下文,我使用了这个小测试脚本test2.sh--noclose相当于 xterm 的-hold

#!/bin/bash
echo "This is `basename $0`"

在“cron”领域,请记住,您正常的 shell 环境的可见性非常有限。将命令添加env到 cron 调用的脚本中,以查看它可以访问的内容。您通常需要使用所有内容的完整路径,包括 /bin/ 中的内容。它也可能默认为sh而不是bash,因此在限定要使用的 shell 时要明确。目前,在大多数发行版中sh通常是,但在兼容模式下调用,可能会破坏许多东西。bash

如果您正在调试 cronjob,请查看 /var/log/cron 以了解它们是否正在运行以及是否存在任何错误。您还应该查看所使用的服务systemctl status crond以确保它正在运行并且没有处于失败状态。最后,journalctl 和 /var/log/messages 包含 cronjob 执行时的信息。

* * * * *测试完成后,显然要将 crontab 中的计划更改为@reboot。

还有一个非常(编辑-忘记了形容词) 相似的systemd 中的计时器功能。它的语法有点挑剔,默认情况下将以 root 身份运行,但如果您好奇的话: https://coreos.com/os/docs/latest/scheduling-tasks-with-systemd-timers.html

答案2

您怎么知道“什么都没发生”?仅仅因为脚本没有在屏幕上的窗口中弹出,并不意味着它没有运行。


Cron 是为“批处理”任务而设计的,而不是为启动交互式程序而设计的,因此它不仅惯于自动为你启动一个终端窗口(虽然也可以手动完成),大多数情况下不能启动任何图形应用程序,因为它不知道应该使用哪个 X 会话。

(事实上​​,cron 通常在 Xorg 初始化图形之前就运行@reboot 任务......)

这意味着 cron 作业的输出会发送到其他地方 - 现在它可能正在用无数个“Hello World”淹没你的系统日志(journalctl、/var/log/syslog 或类似的东西)。

另外,如果系统已配置(通常在服务器上),cron 可以通过电子邮件发送作业输出。但是,这仅在作业完成时发生(并且您的示例脚本永远不会完成)。


如果你想运行屏幕上显示的内容,有一些机制可以做到这一点登录时(非启动时):

  • 有可能您可以放入~/Scripts/test.sh &~/.xprofile文件。这通常有效,但取决于系统使用的显示管理器。

  • 另一种方法是创建一个~/.config/autostart/my-test-script.desktop

    [Desktop Entry]
    Name=my test script
    Type=Application
    Exec=/home/myuser/Scripts/test.sh
    Terminal=yes
    

相关内容