“at”命令不运行所需的程序/脚本

“at”命令不运行所需的程序/脚本

我正在尝试使用“at”命令学习调度,因此,我想对其进行测试并保持简单。例如,当我键入"at 00:28"(我的时区格式),然后输入 时/usr/bin/leafpad,我预计 leafpad 会在 00:28 开始。但这并没有发生。基本上什么也没发生。当我用 检查相关作业 ID 时"at -c jobid",它的尾部显示“执行目录无法访问”。

这很奇怪,因为当我输入 时"/usr/bin/leafpad",leafpad 实际上会打开。

顺便说一句,我正在使用 Kali Linux。

答案1

Leafpad 是一个交互式编辑器。您几乎永远无法通过at(或cron类似的设施)成功运行交互式程序。造成这种情况的原因有很多,目前最重要的一个是这些设施完全脱离了用户环境,并且没有用户环境的概念。没有登录 shell,没有 PATH 变量,也没有通常与终端会话关联的内容。

开始学习的更好方法at是使用该logger命令,该命令只需将消息注入系统日志中。一个例子是:

$ echo "/usr/bin/logger 'This is a message'" | at now +10 minutes

/usr/bin/logger 'This is a message'该命令将在您运行 10 分钟后执行该命令。使用此示例,您可以推断该at命令及其要调用的其他可执行文件的进一步用法。

答案2

实际上,您可以在 中运行任何有效的 shell 代码片段at,并执行所有常规重定向。因此,“我可以运行什么?”基本上就是“任何不需要连接到终端的东西”。它不知道哪个终端启动了延迟任务,也不知道您是否关闭了终端,或者现在是否已注销。

at创建一个大型脚本,其中包含您创建任务时环境的快照。 (它甚至包括 OLDPWD!)该脚本的最后一行是您告诉at要做的事情。尝试这个:

$ at 2000
warning: commands will be executed using /bin/sh
at> { pwd; echo $HOME; echo $PATH; env; } >> At.env 2>&1
at> <EOT>
job 97 at Wed Mar  6 20:00:00 2024
$ #.. Show the script just created.
$ at -c 97 | wc -l
55
$ at -c 97 | head | cut -c 1-60
#!/bin/sh
# atrun uid=1000 gid=1000
# mail paul 0
umask 2
LS_COLORS=rs=0:di=01\;34:ln=01\;36:mh=00:pi=40\;33:so=01\;35
LESSCLOSE=/usr/bin/lesspipe\ %s\ %s; export LESSCLOSE
LANG=en_GB.UTF-8; export LANG
GDM_LANG=en_GB; export GDM_LANG
COMPIZ_CONFIG_PROFILE=mate; export COMPIZ_CONFIG_PROFILE
GTK_OVERLAY_SCROLLING=0; export GTK_OVERLAY_SCROLLING
$ #.. See the path, and the original command.
$ at -c 97 | tail
PATH=/home/paul/bin:/home/paul/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin; export PATH
SESSION_MANAGER=local/paul-RV415-RV515:@/tmp/.ICE-unix/1231,unix/paul-RV415-RV515:/tmp/.ICE-unix/1231; export SESSION_MANAGER
LESSOPEN=\|\ /usr/bin/lesspipe\ %s; export LESSOPEN
OLDPWD=/home/paul/D_Recovery; export OLDPWD
cd /home/paul || {
     echo 'Execution directory inaccessible' >&2
     exit 1
}
{ pwd; echo $HOME; echo $PATH; env; } >> At.env 2>&1

存储的脚本在 /bin/sh 下运行(无论安装时链接到什么)。您当然可以at运行date >> myAt.log以确认它在预期时间运行。

生成的脚本at在其下运行sh(因为它有自己的 shebang),您传入的任何文本也是如此。但是,如果该文本的一部分执行具有其自己的 shebang 的脚本,则内核会确保该脚本在其下运行那个翻译正确。

相比之下,运行相同的代码片段cron将为您提供一个非常简单的环境。

* * * * * { pwd; echo $HOME; echo $PATH; env; } >> Cron.env 2>&1

outputs

$ cat Cron.env
/home/paul
/home/paul
/usr/bin:/bin
LANGUAGE=en_GB:en
HOME=/home/paul
LOGNAME=paul
PATH=/usr/bin:/bin
LANG=en_GB.UTF-8
SHELL=/bin/sh
PWD=/home/paul
$ 

答案3

在我的系统中, echo mousepad | at now+1 minutes仅当我已经打开鼠标垫时,才会在鼠标垫上打开新选项卡。

使用 Leafpad,即使我已经打开 Leafpad,也不会发生任何事情 - 显然 Leafpad 没有选项卡。

如上所述,at它不是为 GUI 程序设计的。

相关内容