Crontabファイルの内容は次のとおりです。
Shell=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO="[email protected]"
*/5 * * * * sh /robot/1/master.sh >/dev/null 2>&1
*/5 * * * * sh /robot/2/master.sh >/dev/null 2>&1
*/5 * * * * sh /robot/3/master.sh
*/5 * * * * sh /robot/4/master.sh >/dev/null 2>&1
*/5 * * * * sh /robot/5/master.sh >/dev/null 2>&1
これは、実行しようとすると/var/log/cron
に表示され続けるエラーです。
crond[669]: (sh) ERROR (getpwnam() failed)
これらのファイルのいずれかを手動で実行すると、問題なく機能します。
Crontabファイルの何が問題になっていますか?
誰もこれに対する正しい答えを持っていないことは驚きです。今日、私はまったく同じ問題に直面し、グーグルは助けにならなかった。
2時間後、/ etc/cron.dにファイルを配置するときに、スケジュール行に追加のオプションを含める必要があることがわかりました。...
私はいつもこれをcrontab -eに使用します
# Minute Hour Day of Month Month Day of Week Command
# (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat) /my/fancy/script.sh
したがって、6つのアイテムが含まれています。
これを/etc/cron.d内のファイルに配置する場合、cronには、fancy/scriptを実行するユーザーである追加のオプションが必要です。
# Minute Hour Day of Month Month Day of Week Who Command
# (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat) root /my/fancy/script.sh
これはman crontab(5)で文書化されています。たとえば、 https://linux.die.net/man/5/crontab です。それは言います:
/ etc/cron.d /のジョブ
Cron.dのジョブはシステムジョブであり、通常は複数のユーザーに使用されます。それがユーザーの名前が必要な理由です。最初の行のMAILTOはオプションです。
crontabの簡単な答えは、コマンドを実行するためにUSERを指定する必要があります
rOOTとして実行する例は次のとおりです。
0、10、20、30、40、50 * * * * root/path_to_script/script_name
または、ユーザーFREDとして実行する
0,10,20,30,40,50 * * * * fred/path_to_script/script_name
uSERが指定されていないデフォルトでは、ユーザーCRONとして実行され、そのユーザーにはスクリプトを実行する権限がありません。
6番目の位置はsernameジョブの実行用に予約されています。 sh
という名前のユーザーを指定しましたが、これはおそらくマシン上に存在しません。
Crontabファイルに何も問題はありません(「my」crontabによる限り、システムcrontabではなくユーザーcrontabであることを意味します。それ以外の場合は、 他の回答を参照 )。
一方、システムのディレクトリサービスには何か問題があります。Linuxでは、_nsswitch.conf
_で構成されています。おそらく、Kerberos認証されたLDAPストアを使用しており、cronデーモンに接続するためのKerberosトークンがありません(または、ネットワークアクセスを持たないように、SELinuxのようにサンドボックス化されています)。おそらく、crontabが実行されているユーザーが読み取れないファイルストアです。おそらく他の奇妙で面白いことが起こっています。
getpwnam()
は、現在ログインしているユーザーの名前の検索を実行するCライブラリ呼び出しです。シェルがbashの場合、_I have no name!
_の名前にフォールバックするため、このエラーはsh
実装を意味します違うものです。 (bashでスクリプトを実行する場合は、bash
ではなくsh
を使用します)。
システム用と個人用のcronジョブを作成できます。 _/etc/crontab
_のcrontabは、システムcronジョブに特に使用されます。したがって、誰が実行するcronjobコマンドを指定する必要があります。質問では、ユーザー名が指定されていません。したがって、ERROR (getpwnam() failed)
が発生します。 _/var/spool/cron/username
_でユーザー固有のcronjobを作成できます
注:: Cronジョブは非常に便利ですが、失敗すると悲惨です!