当サイトではアフィリエイト広告を利用しています。

【Linux】cron登録したスクリプトが全く実行されない場合の原因と対処方法を紹介!

cronでシェルスクリプトを毎分実行するよう登録しているのに、何故か出力先に何も出てこない。。。

そんな時の状況確認方法と原因、解決方法を紹介します!

どんなシェルスクリプトを実行させようとしているのか?

まずは、何をやろうとしているのかを紹介します。

下記の記事で監視対象のLinuxのリソース(CPU,メモリ)使用率をCSVに出力する方法を紹介しましたが、このスクリプトの確認環境はUbuntuだったのでせっかくなら借りているCentOSが入っているVPSにも導入しようとしてます。

これを記事通りに導入してcron登録したところ5分経っても全くCSV出力されないので、原因確認と対処をしていきます。

CSV出力されない問題の原因調査

作成したシェルスクリプトに問題はないかを確認

log_cpu_mem.sh

#!/bin/bash
logfile="/home/centos/cpu_mem/log/resource_log$(date "+%Y-%m-%d").csv"

echo "$(date '+%Y-%m-%d %H:%M:%S'),$(top -b -n1 | grep '%Cpu(s)' | awk -F',' '{print $4}' | awk '{printf("%.1f", 100 - $1)}'),$(free -m | awk '/Mem:/ {printf("%.1f", $3/$2*100)}')" >> $logfile

このスクリプトがあるディレクトリに「log」ディレクトリを作成し、その中にある「resource_log日付.csv」内に「日時,CPU使用率,メモリ使用率」を格納するスクリプトなのですが、想定通りに実行されれば初回実行で「resource_log日付.csv」が作成されその中にリソース情報が1行入っており、2回目の実行では2行目にリソース情報が格納されます。

スクリプト実行結果

$cat resource_log2025-08-06.csv
2025-08-06 14:14:26,0.0,30.2

うん、問題なさそうですね。

cron設定を確認

$ cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
* * * * * centos /home/centos/cpu_mem/log_cpu_mem.sh //←ここが今回のcron設定!

🧠 cron の基本構文

cronには以下のようなルールがあります:

分 時 日 月 曜日 [ユーザー名] 実行するコマンド

この記述のことを「cronジョブ」とか「crontabエントリ」と言います。

✨ 各項目の意味を解説
* * * * * centos /home/centos/cpu_mem/log_cpu_mem.sh
項目 意味 内容
* 分(0~59) 毎分
* 時(0~23) 毎時
* 日(1~31) 毎日
* 月(1~12) 毎月
* 曜日(0~7) 毎週(0か7が日曜日)
centos 実行するユーザー centos ユーザーとして実行
/home/centos/cpu_mem/log_cpu_mem.sh 実行するスクリプトのパス CPUやメモリをログするシェルスクリプト
💡 この設定が意味すること

centos というユーザーで、毎分/home/centos/cpu_mem/log_cpu_mem.sh というシェルスクリプトを実行してね」

という意味なので、設定は間違っていないようです。

ログを確認してみる

CentOSでは/var/log/cronにcronのログが入っているので、中身を確認してみます。

cron設定完了後の時刻を確認してみると明らかに異常なログがありました。

Aug 6 14:14:01 localhost CROND[2277358]: (centos) CMD (/home/centos/cpu_mem/log_cpu_mem.sh)
Aug 6 14:14:01 localhost CROND[2277357]: (centos) CMDOUT (/bin/bash: line 1: /home/centos/cpu_mem/log_cpu_mem.sh: Permission denied) //←注目!!!
Aug 6 14:14:01 localhost CROND[2277357]: (centos) CMDEND (/home/centos/cpu_mem/log_cpu_mem.sh)

2行目のメッセージに”Permission denied”との記載があるため、権限不足のようです。

log_cpu_mem.shファイルを確認

-rwxr--r-- 1 centos centos 413 Aug 6 14:09 log_cpu_mem.sh

グループと他ユーザに実行権限がないので動いていなかったようですね!

権限の読み方は以下で紹介していますので是非ご覧ください!

その他の原因

上記の原因っぽくないようでしたら、cronは結構シビアなファイルなので以下のような原因でそもそもファイルを読み込めていないかもしれないです。

対処方法の前に。。。

そもそもなんで、実行権限をわざわざつけなくてはならないのかというと、、、

$sudo vi /etc/crontab

crontabのファイルに直書きすればいいや~って言って、これでcron設定してません?

この直書き行為自体、非推奨行為ではありますが法人システムとかでない限りは自由に失敗すればいいので一旦置いといて、この"/etc/crontab"はrootユーザのものなので、グループもしくは他ユーザからの実行と判断され権限不足となっています。

なので、対処方法は2つあります。

対処方法

スクリプトファイルに実行権限を付与

対象ファイルに実行権限をつけちゃうというのが一番簡単です。

$chmod 755 log_cpu_mem.sh
もしくは
$chmod o+x log_cpu_mem.sh

これで、centosユーザ以外のユーザでも実行可能になります。

一般ユーザのcrontabに設定する

今回スクリプトファイルを作成し、実行試験も問題なかったのは一般ユーザである「centos」というユーザです。
このユーザとしてのcrontabを設定してあげれば、権限問題は事前に回避できます。

一般ユーザでcron設定するコマンド

$crontab -e

これだけでエディタが開きます。

エディタはviなのでいつも通りの使い方で設定を記述できます!

* * * * * /home/centos/cpu_mem/log_cpu_mem.sh

/etc/crontabに直書きしていたときは実行ユーザにcentosを設定していましたが、各ユーザ独自で使えるcronなのでユーザ部分に関しては設定する必要はなくて大丈夫です。

ファイルを保存して、viエディタを閉じると以下のようにメッセージが出ます。

$ crontab -e
no crontab for centos - using an empty one
crontab: installing new crontab

これで実行出来ているはずなので、2分くらいまってみましょう。

対処結果

対処方法を実施後、何分か待つと何行か追加されていることでしょう。

$ cat log/resource_log2025-08-06.csv
2025-08-06 14:14:26,0.0,30.2 //手動実行時の出力
2025-08-06 14:38:01,6.2,30.6 //ここから下がcron実行での出力
2025-08-06 14:39:01,12.5,30.6
2025-08-06 14:40:01,6.2,30.6

きちんと1分ごとに出力されているようですね!

🔰 Linuxを試せる環境がない方へ

コマンドなどを実際に試してみたいけれど、Linux環境がない…
そんなときは、「さくらのVPS」を使えば簡単に自分専用のLinux環境が手に入ります!

  • ✅ 月額524円(税込)〜手軽に始められる
  • ✅ UbuntuやDebianなど、好みのOSが選べる
  • ✅ SSH接続でターミナル操作もバッチリ
  • ✅ 日本国内の大手サービスで安心・安定

さくらのVPSでLinux学習をはじめる

\ あなただけのLinux環境を5分で構築! /