我正在构建一个unix包,其中有一个脚本,根据客户的要求,脚本应该只运行一次(而不是每天运行)。我不确定它会如何运作? 我的意思是,我需要安排它吗?如果是,那么我找不到任何 cron 命令。 如果没有,那么安装包时脚本如何执行?
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 运行它。
在 Unix/Linux 中安排任务的一般方法有两种:
cron
对于可重复的任务很有用。at
对于单一任务很有用。因此,就您而言,我会使用
at
来安排您的任务。
您可以使用瞬态 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
或检查:
如果只在安装包时执行一次,则根本不需要cron,只需让用户执行它即可。假设您指示用户执行类似
./install
的操作,并包含脚本,仅此而已。
但正如之前有人所说,首先要定义一次是什么意思。
问候。