web-dev-qa-db-ja.com

cronから呼び出された場合のみ、/ bin / shで「getpwnam()failed」

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ファイルの何が問題になっていますか?

22
Andrew

誰もこれに対する正しい答えを持っていないことは驚きです。今日、私はまったく同じ問題に直面し、グーグルは助けにならなかった。

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はオプションです。

74
hetOrakel

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として実行され、そのユーザーにはスクリプトを実行する権限がありません。

2
Mark Baiter

6番目の位置はsernameジョブの実行用に予約されています。 shという名前のユーザーを指定しましたが、これはおそらくマシン上に存在しません。

1
Yuri

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を使用します)。

0
Charles Duffy

システム用と個人用のcronジョブを作成できます。 _/etc/crontab_のcrontabは、システムcronジョブに特に使用されます。したがって、誰が実行するcronjobコマンドを指定する必要があります。質問では、ユーザー名が指定されていません。したがって、ERROR (getpwnam() failed)が発生します。 _/var/spool/cron/username_でユーザー固有のcronjobを作成できます

注:: Cronジョブは非常に便利ですが、失敗すると悲惨です!

0
Vimal Surendran