Ubuntuでコマンドを時間指定で実行する方法|初心者でも簡単にできる3つのやり方

Linux

Ubuntuを使っていて、こんなことで困っていませんか?

  • 毎日決まった時間にバックアップを取りたい
  • 数分後に自動でコマンドを実行したい
  • 定期的にシステムのメンテナンスをしたい
  • 手動でやっている作業を自動化したい

実は、Ubuntuにはコマンドを時間指定で実行する機能がいくつも用意されています。
しかし、初心者の方には「cronって何?」「どのコマンドを使えばいいの?」と混乱しがちです。

この記事では、Ubuntuでコマンドを時間指定で実行する3つの方法を、それぞれの特徴と使い分け方を含めて、わかりやすく説明します。

スポンサーリンク

時間指定実行の3つの方法

使い分けの基本

1回だけ実行したい場合

  • atコマンドを使用
  • 「明日の朝9時に1回だけ」という場合

定期的に実行したい場合

  • cronを使用
  • 「毎日夜8時に」「毎週月曜日に」という場合

少し後に実行したい場合

  • sleepコマンドを使用
  • 「今から10分後に」という場合

それぞれ詳しく見ていきましょう。

方法1:atコマンド(1回限りの実行)

atコマンドとは?

atコマンドは:

  • 指定した時刻に1回だけコマンドを実行
  • 「明日の朝にファイルをバックアップ」のような使い方
  • 実行後は自動的に予約が削除される

インストールと確認

atがインストールされているか確認

which at

インストールされていない場合

sudo apt update
sudo apt install at

atデーモンの状態確認

sudo systemctl status atd

atデーモンを起動(必要な場合):

sudo systemctl start atd
sudo systemctl enable atd

基本的な使い方

基本構文

echo "実行したいコマンド" | at 時刻

具体例1:今日の15時30分に実行

echo "echo 'バックアップ完了' >> ~/log.txt" | at 15:30

具体例2:明日の朝7時に実行

echo "~/backup_script.sh" | at 7:00 tomorrow

具体例3:1時間後に実行

echo "echo '1時間経過しました'" | at now + 1 hour

時間の指定方法

時刻の指定

  • 15:30:今日の15時30分
  • 7:00 AM:今日の朝7時
  • 9:30 PM:今日の夜9時30分

日付の指定

  • tomorrow:明日
  • 15:30 tomorrow:明日の15時30分
  • 2024-12-25:具体的な日付

相対時間

  • now + 30 minutes:30分後
  • now + 2 hours:2時間後
  • now + 1 day:1日後

atコマンドの管理

予約されたジョブを確認

atq

予約をキャンセル

# ジョブ番号1をキャンセル
atrm 1

詳細な予約内容を確認

# ジョブ番号1の詳細
at -c 1

方法2:cron(定期的な実行)

cronとは?

cronは:

  • 指定した時間に定期的にコマンドを実行
  • 「毎日」「毎週」「毎月」のような繰り返し実行
  • Linuxシステムの基本機能

cronの設定方法

個人用cronの編集

crontab -e

初回実行時のエディタ選択

  • nanoエディタ(初心者におすすめ)
  • vimエディタ
  • その他のエディタ

cronの書式

基本書式

分 時 日 月 曜日 実行するコマンド

各項目の意味

  • :0-59
  • :0-23
  • :1-31
  • :1-12
  • 曜日:0-7(0と7は日曜日、1は月曜日)

cronの記述例

毎日決まった時間

# 毎日朝7時にバックアップ
0 7 * * * /home/user/backup.sh

# 毎日夜23時30分にログ整理
30 23 * * * /home/user/cleanup.sh

毎週決まった曜日

# 毎週月曜日の9時にレポート作成
0 9 * * 1 /home/user/report.sh

# 毎週日曜日の夜にシステム更新
0 22 * * 0 sudo apt update && sudo apt upgrade -y

毎月決まった日

# 毎月1日の朝8時に月次処理
0 8 1 * * /home/user/monthly.sh

複数回実行

# 毎日8時、12時、18時にチェック
0 8,12,18 * * * /home/user/check.sh

# 10分おきに監視
*/10 * * * * /home/user/monitor.sh

cronの管理

現在のcronを確認

crontab -l

cronを削除

crontab -r

cronのログを確認

grep CRON /var/log/syslog

cronでよくある問題と対策

パスの問題

# 悪い例(パスが通らない可能性)
0 7 * * * backup.sh

# 良い例(フルパスを指定)
0 7 * * * /home/user/backup.sh

環境変数の問題

# cronの先頭で環境変数を設定
PATH=/usr/local/bin:/usr/bin:/bin
HOME=/home/user

0 7 * * * /home/user/backup.sh

権限の問題

# スクリプトに実行権限を付与
chmod +x /home/user/backup.sh

方法3:sleepコマンド(遅延実行)

sleepコマンドとは?

sleepコマンドは:

  • 指定した時間だけ待機するコマンド
  • 他のコマンドと組み合わせて遅延実行
  • 簡単な時間指定に便利

基本的な使い方

秒数で指定

# 5秒待ってからファイルを作成
sleep 5 && touch ~/test.txt

分で指定

# 10分後にメッセージを表示
sleep 600 && echo "10分経過しました"
# または
sleep 10m && echo "10分経過しました"

時間で指定

# 2時間後に実行
sleep 2h && ~/cleanup.sh

&&演算子の使い方

成功時のみ実行

# 前のコマンドが成功した場合のみ次を実行
sleep 300 && echo "5分後に実行"

複数のコマンドを連続実行

# 3つのコマンドを順番に実行
sleep 60 && echo "1分経過" && echo "処理開始"

バックグラウンド実行

バックグラウンドで実行

# 端末を閉じても実行し続ける
nohup sleep 3600 && ~/hourly_task.sh &

プロセスの確認

# 実行中のバックグラウンドプロセスを確認
jobs
ps aux | grep sleep

実践的な使用例

バックアップの自動化

毎日のバックアップ

# cronでの設定(毎日夜1時)
0 1 * * * tar -czf ~/backup/backup_$(date +\%Y\%m\%d).tar.gz ~/Documents

週1回のシステムバックアップ

# 毎週日曜日の深夜2時
0 2 * * 0 sudo rsync -av /home/ /backup/home_backup/

ログの管理

古いログの削除

# 毎日夜中に30日前のログを削除
0 0 * * * find /var/log -name "*.log" -mtime +30 -delete

システムの監視

定期的なディスク容量チェック

# 1時間おきにディスク使用量をチェック
0 * * * * df -h > ~/disk_usage_$(date +\%Y\%m\%d_\%H).txt

トラブルシューティング

cronが動かない場合

確認すべきポイント

  1. cronサービスが動いているかsudo systemctl status cron
  2. スクリプトに実行権限があるかchmod +x /path/to/script.sh
  3. フルパスで指定しているか# 相対パスではなくフルパスを使用 /home/user/script.sh
  4. ログを確認grep CRON /var/log/syslog tail -f /var/log/syslog

atコマンドが動かない場合

確認すべきポイント

  1. atdサービスの状態sudo systemctl status atd
  2. 権限の問題# /etc/at.allowと/etc/at.denyを確認 ls -la /etc/at.*

sleepコマンドの注意点

端末を閉じると停止

  • 解決策:nohupコマンドを使用
  • またはscreentmuxを使用

長時間の待機

  • 非常に長い時間の場合はcronを推奨
  • sleepは短時間(数時間以内)に適している

セキュリティの考慮

cronでのセキュリティ

権限の最小化

# 不要なsudo権限は避ける
# 必要最小限の権限でスクリプトを実行

ログの記録

# 実行結果をログに記録
0 1 * * * /home/user/backup.sh >> /home/user/logs/backup.log 2>&1

ファイルの権限

スクリプトファイルの権限

# 所有者のみ読み書き実行可能
chmod 700 /home/user/scripts/
chmod 600 /home/user/scripts/*.sh

まとめ:目的に応じて使い分けよう

Ubuntuでのコマンド時間指定実行は、目的に応じて適切な方法を選択することが重要です。

この記事のポイント

  • at:1回限りの実行(明日の朝など)
  • cron:定期的な実行(毎日、毎週など)
  • sleep:少し後の実行(数分後、数時間後)

選択の基準

方法適用場面メリット注意点
at1回限りの実行簡単、自動削除atdサービスが必要
cron定期的な実行強力、柔軟設定が複雑
sleep短時間の遅延簡単、軽量端末依存

実用的な活用例

日常業務の自動化

  • 毎日のバックアップ(cron)
  • 週次レポートの作成(cron)
  • 一時的なタスクの遅延実行(at)

システム管理

  • ログファイルの定期清理(cron)
  • システム更新の自動化(cron)
  • メンテナンス作業の予約(at)

自動化により、手動作業の時間を大幅に削減し、より重要な作業に集中できるようになります。まずは簡単なタスクから始めて、徐々に複雑な自動化にチャレンジしてみましょう!


よくある質問

Q: cronとatのどちらを使うべきか迷います

A: 繰り返し実行ならcron、1回限りならatです。迷った場合は、まずatで試してから、定期化が必要になったらcronに移行すると良いでしょう。

Q: 実行されているか確認する方法はありますか?

A: cronの場合は/var/log/syslogを確認、atの場合はatqでキューを確認できます。また、実行結果をログファイルに出力する設定をおすすめします。

Q: 複数のコマンドを同時に実行したいのですが

A: シェルスクリプトファイルにまとめるか、&&;で連結できます。複雑な処理はスクリプトファイル化することをおすすめします。

コメント

タイトルとURLをコピーしました