Tutoriel Linux

Linuxで常駐クロンジョブを作成せずに唯一のコマンドをプログラムする

Débutant2 min de lecture

今晩、明日の朝、またはメンテナンスウィンドウの後にコマンドを一度だけ実行する必要がありますか? at は忘れてしまうcronジョブを作成するのを避けます。ただし、atd サービスが実行中でなければならず、コマンドは /bin/sh によって実行されるため、必ずしもインタラクティブなシェルによって実行されるわけではありません。

以下の方法では、ジョブをスケジュールして制御し、実行前に取り消すことができます。スクリプトやログファイルには絶対パスを使用してください。atジョブは、ターミナルやあなたのBash設定の影響を受けません。

サーバー、時計、カレンダーの近くにいるTuxがLinuxで単一のコマンドをスケジュールするため
atdサービスは、スケジュールされた時間に単一のコマンドを実行します。

atのインストールとサービスの確認

Debian、Ubuntu及びその派生版では、パッケージをインストールしてデーモンを有効にします。Fedora、RHELまたはRocky Linuxの場合は、apt を dnf に置き換えてください。

sudo apt update
sudo apt install at
sudo systemctl enable --now atd
systemctl status atd --no-pager

ステータスは active (running) と表示されるべきです。あなたのアカウントが拒否された場合は、/etc/at.allow および /etc/at.deny を確認してください。これらのファイルは、どのユーザーがタスクを提出できるかを決定します。

cronを残さずにコマンドをスケジュールする

システムに手を出さずにテストするために、5分後に自分のホームディレクトリに小さなファイルを作成します。コマンドを入力し、入力をCtrl + D で終了してください。

at now + 5 minutes
mkdir -p "$HOME/at-test"
date > "$HOME/at-test/executed-at.txt"
# その後 Ctrl+D を押してください

実際の介入のためには、相対パスを避けてください。次のジョブは、明日の02:30にサービスを再起動し、stdoutおよびstderrを既知のログに保存します:

at 02:30 tomorrow
/usr/bin/systemctl restart mon-service.service >> /var/log/mon-service-at.log 2>&1
# その後 Ctrl+D を押してください

再起動やリモート変更を予定する前に、コマンドを手動で確認してください。SSHで作業している場合は、ネットワークまたはサービスを切断する可能性のある変更の前に、セカンドセッションを開いておいてください。

ジョブを再確認し、マシンの時間を確認する

atq は、待機中のジョブとそのIDを表示します。at -c により、実際に登録されたスクリプトを表示できます。この読み取りは、変数、現在のディレクトリ、またはリダイレクトがコマンドに影響を与える場合に便利です。

atq
at -c 7
timedatectl status

7をatqによって表示された番号に置き換えてください。また、timedatectl statusを使ってタイムゾーンも確認してください。atに入力された日付は、デーモンを実行するマシンによって解釈されます。UTCに設定されたサーバーは、あなたの端末に表示された時間にジョブを必ずしも実行するわけではありません。

実行前にジョブをキャンセルする

削除は即座に行われます。IDを再取得し、ジョブを削除してから、atq を再度実行して、それが消えたことを確認してください。

atrm 7
atq

atを使って一回限りのアクションを実行します:移行後のクリーニング、単一の再起動、または遅延テスト。繰り返しのタスクには、cronとcrontabまたはsystemdタイマーを使用してください。一度予定されたコマンドを忘れてしまう自動化に変えることを避けることができます。