'at'コマンドは必須プログラム/スクリプトを実行しません。

'at'コマンドは必須プログラム/スクリプトを実行しません。

「at」コマンドを使ってスケジューリングを学びたいので、テストしてみて簡単に保ちたいです。たとえば、"at 00:28"(私のタイムゾーンの形式)を入力してからを入力すると、/usr/bin/leafpadleafpadは00:28に開始すると予想されます。しかし、そのようなことは起こりませんでした。基本的に何も起こりません。で関連ジョブIDを確認してみると、"at -c jobid"最後に「実行ディレクトリにアクセスできません」と出てきます。

と入力すると"/usr/bin/leafpad"実際にはリーフパッドが開くので、これは奇妙です。

ところで、私はKali Linuxを使用しています。

答え1

Leafpadはインタラクティブエディタです。at(またはcron同様の施設)で対話型プログラムを正常に実行できることはほとんどありません。このような状況にはいくつかの理由がありますが、現在最も重要なことは、これらの施設がユーザーエクスペリエンスから完全に分離されており、ユーザーエクスペリエンスの概念がないことです。ログインシェルもなく、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

実際に有効なシェルコードスニペットを実行し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

生成されたスクリプトは、渡されたすべてのテキストと同様に独自のshebangがあるため、atその下で実行されます。shただし、そのテキストの一部が独自の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にはタブはありません。

上記のように、atGUIプログラム用に設計されていません。

関連情報