当使用时at midnight next month
,1 月 31 日,它会表现如何?是3月4日还是2月28日?还是3月31日?
root@calleva:/var/spool/cron/atjobs# echo "sleep 3000" | at 20:58
warning: commands will be executed using /bin/sh
job 161 at Sat Jun 3 20:58:00 2023
root@calleva:/var/spool/cron/atjobs# ls
a000a101acba0e
root@calleva:/var/spool/cron/atjobs# cat a000a101acba0e
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
LANGUAGE=en_GB:en; export LANGUAGE
PWD=/var/spool/cron/atjobs; export PWD
LOGNAME=root; export LOGNAME
XDG_SESSION_TYPE=tty; export XDG_SESSION_TYPE
MOTD_SHOWN=pam; export MOTD_SHOWN
HOME=/root; export HOME
LANG=en_GB.UTF-8; export LANG
SSH_CONNECTION=192.168.0.12\ 60848\ 192.168.0.113\ 22; export SSH_CONNECTION
XDG_SESSION_CLASS=user; export XDG_SESSION_CLASS
USER=root; export USER
SHLVL=0; export SHLVL
XDG_SESSION_ID=1202; export XDG_SESSION_ID
XDG_RUNTIME_DIR=/run/user/0; export XDG_RUNTIME_DIR
SSH_CLIENT=192.168.0.12\ 60848\ 22; export SSH_CLIENT
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/.dotnet/tools:/root/bin:/opt/mssql-tools/bin:/usr/games; export PATH
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus; export DBUS_SESSION_BUS_ADDRESS
SSH_TTY=/dev/pts/5; export SSH_TTY
OLDPWD=/root; export OLDPWD
cd /var/spool/cron/atjobs || {
echo 'Execution directory inaccessible' >&2
exit 1
}
sleep 3000
root@calleva:/var/spool/cron/atjobs# atq
161 Sat Jun 3 20:58:00 2023 a root
root@calleva:/var/spool/cron/atjobs#
有没有办法告诉该文件a000a101acba0e
对应于队列项161
?
我对使用 at 很陌生,想知道如何通过预定作业显示命令。
postgres@dcjsn-jv2526:/opt/db/backup/postgres/dumps> atq
29 Wed Nov 2 18:55:00 2022 a postgres
我看到某个用户在某个时间安排了一项工作 29。现在我想检查要执行的命令。我该如何实现?联机帮助页中没有关于此的内容。
at
我在待处理作业队列中有一些任务,
$ atq
28 Wed Oct 31 10:23:00 2018
27 Tue Oct 30 21:20:00 2018
25 Tue Oct 30 21:19:00 2018
26 Tue Oct 30 21:20:00 2018
20 Tue Oct 30 18:25:00 2018
30 Wed Oct 31 10:59:00 2018
32 Wed Oct 31 21:03:00 2018
23 Tue Oct 30 18:28:00 2018
31 Wed Oct 31 13:58:00 2018
19 Tue Oct 30 15:43:00 2018
21 Tue Oct 30 18:27:00 2018
我想获取工作编号并将其删除
$ atq | awk '{print $1}'
20
30
32
23
31
19
21
但是,它没有按预期工作
$ atq | awk '{print $1}'| atrm ; atq
20 Tue Oct 30 18:25:00 2018
30 Wed Oct 31 10:59:00 2018
32 Wed Oct 31 21:03:00 2018
23 Tue Oct 30 18:28:00 2018
31 Wed Oct 31 13:58:00 2018
19 Tue Oct 30 15:43:00 2018
21 Tue Oct 30 18:27:00 2018
我用命令替换解决了问题
$ atrm $(echo "$(atq | awk '{print $1}')")
为什么管道没有按预期执行atrm
?
我在队列中有一系列待处理的工作,
$ atq
8 Mon Oct 29 13:21:00 2018
5 Mon Oct 29 10:36:00 2018
15 Mon Oct 29 13:31:00 2018
4 Mon Oct 29 10:35:00 2018
18 Mon Oct 29 15:55:00 2018
3 Mon Oct 29 10:31:00 2018
16 Mon Oct 29 15:54:00 2018
11 Mon Oct 29 13:24:00 2018
12 Mon Oct 29 13:24:00 2018
17 Mon Oct 29 15:53:00 2018
10 Mon Oct 29 13:23:00 2018
19 Tue Oct 30 15:43:00 2018
2 Mon Oct 29 07:41:00 2018
6 Mon Oct 29 10:41:00 2018
7 Mon Oct 29 13:20:00 2018
9 Mon Oct 29 13:22:00 2018
并计划在 10 月 29 日移除他们的工作。幸运的是,atrm 可以移除多个工作
atrm 8 5 15 4
尽管如此,迭代可能是更好的解决方案,
$ atq | grep "Oct 29"
18 Mon Oct 29 15:55:00 2018
3 Mon Oct 29 10:31:00 2018
16 Mon Oct 29 15:54:00 2018
11 Mon Oct 29 13:24:00 2018
12 Mon Oct 29 13:24:00 2018
17 Mon Oct 29 15:53:00 2018
10 Mon Oct 29 13:23:00 2018
2 Mon Oct 29 07:41:00 2018
6 Mon Oct 29 10:41:00 2018
7 Mon Oct 29 13:20:00 2018
9 Mon Oct 29 13:22:00 2018
我如何选择工作编号的第一个字段以迭代它们?
我想暂停我的笔记本电脑使用at
:
echo "systemctl suspend" | at now + 5 minutes
暂停不会发生,而是我从at
in找到一封邮件/var/spool/mail/me
:
Failed to set wall message, ignoring: Interactive authentication required.
Failed to suspend system via logind: Interactive authentication required.
Failed to start suspend.target: Interactive authentication required.
See system logs and 'systemctl status suspend.target' for details.
好的,运行logind
时需要身份验证。这很有趣,因为当我直接运行时,没有,不需要身份验证并且机器进入暂停状态。at
systemctl suspend
systemctl suspend
at
我已确保使用 执行的命令与at
直接使用echo "echo $(who) > who.txt" | at now
.
怀疑需要身份验证,at
因为它通过/bin/sh
(这是 bash 的别名)运行命令,我systemctl suspend
在启动后执行/bin/sh
:挂起立即发生而无需身份验证,这表明嵌套 shell 不是使用at
.
echo "reboot" | at now
执行和时,我得到相同的行为和非常相似的邮件echo "shutdown now" | at now
。
我的问题是:如何logind
确定它at
试图挂起、重新启动或关闭机器,我怎么知道logind
它应该允许at
在没有身份验证的情况下执行这些命令?
我在 Arch Linux 4.18.1 上,at
版本为 3.1.19。
假设我使用at
. 并在几个小时后说,“你知道,我希望该命令现在运行”。有没有一种简单的方法可以现在而不是稍后运行该计划的作业?
我知道我可以简单地atrm
手动运行命令,但是我们的命令是自动化的并且非常复杂。如果有一些简单的方法现在而不是以后运行作业,那就太好了。
我想用 安排作业at
,但我不确定如果计算机在指定时间挂起会发生什么: 计算机再次唤醒时会立即执行命令(如用anacron
)还是根本不执行(像cron
)?
如果您指定一个作业绝对在过去的特定时间和日期运行,该作业将尽快运行。
这就是手册页所说的,但它与我的情况不太匹配:我不想指定过去运行的作业,我想在将来运行它并询问at
如果计算机将如何处理它正在睡觉呢。
这不是计算机睡眠时运行命令的副本,因为此问题询问是否at
会唤醒计算机以执行命令,也不是如何防止 atd 运行过去的作业?因为这是关于如何防止at
执行那些“旧”作业(尽管答案非常好!)。