如何在unix中安排作业只运行一次

问题描述 投票:0回答:4

我正在构建一个unix包,其中有一个脚本,根据客户的要求,脚本应该只运行一次(而不是每天运行)。我不确定它会如何运作? 我的意思是,我需要安排它吗?如果是,那么我找不到任何 cron 命令。 如果没有,那么安装包时脚本如何执行?

linux unix solaris
4个回答
7
投票

Cron 用于重复执行相同的命令或脚本。如果您正在寻找一种方法来安排仅运行一次的脚本,我建议您使用“at”命令

安排脚本从现在起 10 分钟内运行:

at now +10 minutes
sh <path_to_my_script>

然后ctrl+d保存

您可以使用小时|天|周等代替分钟。供参考https://linux.die.net/man/1/at

列出排队的作业:

atq

要删除给定的计划作业:

atrm <job_id>

注意:请确保您有权限运行计划的脚本或使用 sudo 运行它。


4
投票

在 Unix/Linux 中安排任务的一般方法有两种:

  • cron
    对于可重复的任务很有用。
  • at
    对于单一任务很有用。

因此,就您而言,我会使用

at
来安排您的任务。


3
投票

您可以使用瞬态 systemd 计时器运行一次命令,以防

at
在您的系统中不可用。

# systemd-run --on-calendar "Tue 2023-05-23 08:09:00" touch /tmp/hello
Running timer as unit: run-r7cd1a32d0fff4003a4d6fc744c41e1fe.timer
Will run service as unit: run-r7cd1a32d0fff4003a4d6fc744c41e1fe.service

# systemctl list-timers --all
NEXT                          LEFT          LAST                          PASSED      UNIT                                        ACTIVATES
Tue 2023-05-23 08:09:00 CEST  59s left      n/a                           n/a         run-r7cd1a32d0fff4003a4d6fc744c41e1fe.timer run-r7cd1a32d0fff4003a4d6fc744c41e1fe.service
...
8 timers listed.

# systemctl status run-r7cd1a32d0fff4003a4d6fc744c41e1fe.service
● run-r7cd1a32d0fff4003a4d6fc744c41e1fe.service - /usr/bin/touch /tmp/hello
   Loaded: loaded (/run/systemd/transient/run-r7cd1a32d0fff4003a4d6fc744c41e1fe.service; transient)
Transient: yes
   Active: inactive (dead)

如果您想保留此瞬态计时器的日志,您可以使用

--remain-after-exit
标志。例如:

# systemd-run --remain-after-exit --on-calendar "Tue 2023-05-23 08:18:00" echo "Hello"
Running timer as unit: run-r609f6d246df54064bee769e8b2e2f976.timer
Will run service as unit: run-r609f6d246df54064bee769e8b2e2f976.service

...after executing the job...

# systemctl status run-r609f6d246df54064bee769e8b2e2f976.service
● run-r609f6d246df54064bee769e8b2e2f976.service - /usr/bin/echo Hello
   Loaded: loaded (/run/systemd/transient/run-r609f6d246df54064bee769e8b2e2f976.service; transient)
Transient: yes
   Active: active (exited) since Tue 2023-05-23 08:18:00 CEST; 3s ago
  Process: 953587 ExecStart=/usr/bin/echo Hello (code=exited, status=0/SUCCESS)
 Main PID: 953587 (code=exited, status=0/SUCCESS)

May 23 08:18:00 bbpadm-01.bbp.epfl.ch systemd[1]: Started /usr/bin/echo Hello.
May 23 08:18:00 bbpadm-01.bbp.epfl.ch echo[953587]: Hello

这些是您可以在命令行中使用

--on-calendar
参数的一些示例:

  Sat,Thu,Mon..Wed,Sat..Sun → Mon..Thu,Sat,Sun *-*-* 00:00:00
      Mon,Sun 12-*-* 2,1:23 → Mon,Sun 2012-*-* 01,02:23:00
                    Wed *-1 → Wed *-*-01 00:00:00
           Wed..Wed,Wed *-1 → Wed *-*-01 00:00:00
                 Wed, 17:48 → Wed *-*-* 17:48:00
Wed..Sat,Tue 12-10-15 1:2:3 → Tue..Sat 2012-10-15 01:02:03
                *-*-7 0:0:0 → *-*-07 00:00:00
                      10-15 → *-10-15 00:00:00
        monday *-12-* 17:00 → Mon *-12-* 17:00:00
  Mon,Fri *-*-3,1,2 *:30:45 → Mon,Fri *-*-01,02,03 *:30:45
       12,14,13,12:20,10,30 → *-*-* 12,13,14:10,20,30:00
            12..14:10,20,30 → *-*-* 12..14:10,20,30:00
  mon,fri *-1/2-1,3 *:30:45 → Mon,Fri *-01/2-01,03 *:30:45
             03-05 08:05:40 → *-03-05 08:05:40
                   08:05:40 → *-*-* 08:05:40
                      05:40 → *-*-* 05:40:00
     Sat,Sun 12-05 08:05:40 → Sat,Sun *-12-05 08:05:40
           Sat,Sun 08:05:40 → Sat,Sun *-*-* 08:05:40
           2003-03-05 05:40 → 2003-03-05 05:40:00
 05:40:23.4200004/3.1700005 → *-*-* 05:40:23.420000/3.170001
             2003-02..04-05 → 2003-02..04-05 00:00:00
       2003-03-05 05:40 UTC → 2003-03-05 05:40:00 UTC
                 2003-03-05 → 2003-03-05 00:00:00
                      03-05 → *-03-05 00:00:00
                     hourly → *-*-* *:00:00
                      daily → *-*-* 00:00:00
                  daily UTC → *-*-* 00:00:00 UTC
                    monthly → *-*-01 00:00:00
                     weekly → Mon *-*-* 00:00:00
    weekly Pacific/Auckland → Mon *-*-* 00:00:00 Pacific/Auckland
                     yearly → *-01-01 00:00:00
                   annually → *-01-01 00:00:00
                      *:2/3 → *-*-* *:02/3:00

欲了解更多信息,只需在计算机中使用

man systemd-run
或检查:


1
投票

如果只在安装包时执行一次,则根本不需要cron,只需让用户执行它即可。假设您指示用户执行类似

./install
的操作,并包含脚本,仅此而已。

但正如之前有人所说,首先要定义一次是什么意思。

问候。

© www.soinside.com 2019 - 2024. All rights reserved.