如何在特定时间停止脚本,直到它被 cron 再次启动?

如何在特定时间停止脚本,直到它被 cron 再次启动?

我有一个运行 OSMC(基于 Debian)的 Raspberry Pi。

我设置了一个 cron 作业来在午夜启动脚本sync.sh。

0 0 * * * /usr/local/bin sync.sh

我需要在早上 7 点停止脚本。目前我正在使用:

0 7 * * * shutdown -r now

有没有更好的办法?我觉得重启有点过分了。

谢谢

答案1

您可以使用以下命令运行它timeout命令,

timeout - run a command with a time limit

Synopsis
timeout [OPTION] NUMBER[SUFFIX] COMMAND [ARG]...
timeout [OPTION]
Description

Start COMMAND, and kill it if still running after NUMBER seconds. SUFFIX may be 's' for seconds (the default), 'm' for minutes, 'h' for hours or 'd' for days. 

附言。如果您的同步过程花费太多时间,您可能会考虑采用不同的方法来同步数据,可能是块复制。

答案2

如果您的同步在休眠 17 小时后可以轻松继续,请尝试

0 0 * * * killall -CONT -g sync.sh || /usr/local/bin/sync.sh
7 0 * * * killall -STOP -g sync.sh

如果您希望从头开始同步,请尝试

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -TERM -g sync.sh

如果您的同步或其子任务忽略信号但不留下碎片,请这样做

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -KILL -g sync.sh

killallε杂项

答案3

我还会使用 cron 在指定时间“停止”或“终止”该服务或脚本。
首先创建您的 cron 作业来运行您的作业或脚本。 (您可以轻松地运行另一个 cron 来杀死具有名称的作业 sudo pkill wget

其次,您希望在以下输出中以有用且可读的格式查看正在运行的 crontab 任务:

   ps -o pid,sess,cmd afx | egrep "( |/)cron( -f)?$"

它们将出现在第一行,如下所示:

1108  1108 cron
4288  1108 \_ CRON
4289  4289     \_ /bin/sh -c /path/to/my/crontab/script1.sh
4290  4289         \_ /bin/bash /path/to/my/crontab/script1.sh
4295  4289             \_ /usr/bin/wget LINK

第一列是 PID,第二列是会话 ID,第三列是 cron 启动的命令。您可以使用会话 ID 终止与特定 cron 任务相关的所有进程,因此在上面的示例中,您应该终止会话 ID 4289:

   pkill -s 4289

您需要将 pkill 放入脚本中并将其作为 cron 运行

相关内容