Centos 7でcronjob用の新しいシステムアカウントを作成し、それにcronjobを設定しました。
しかし、私のcronjobはエラーで実行されません。
(CRON) ERROR chdir failed (/home/sysagent): No such file or directory
現在のsysagentアカウントのcrontabは次のとおりです。
15 16 * * * HOME="/tmp" && cd path/to/project_folder && ./src/mainroutine.sh | ts "[\%Y-\%m-\%d \%H:\%M:\%S]" >> /var/log/automation/sysagent.log
調査後、HOME変数を追加し、プロジェクトフォルダ(シェルスクリプトのフルパスがあったフォルダ)にcd'dを追加しましたが、役に立ちませんでした。 cronjobがホームディレクトリを忘れさせる方法は?なぜそれを探していますか?
答え1
ドキュメントが間違っているか間違っていると仮定すると、ソースコードは次のように説明します。
% rpm -qa | grep cron
cronie-1.4.11-17.el7.x86_64
cronie-anacron-1.4.11-17.el7.x86_64
crontabs-1.11-6.20121102git.el7.noarch
... RPMのURLが破損しているため、いくつかのaltagoobingleduckがここにあります...
% git clone https://github.com/cronie-crond/cronie && cd cronie
% fgrep -rl 'chdir failed' .
./src/security.c
cron_change_user_permanently
...したがって、エラーは、コード内の他のさまざまな場所から呼び出された呼び出しの1つの場所にのみ表示されます。
% grep cron_change_user_permanently **/*.c
src/do_command.c: if (cron_change_user_permanently(e->pwd, env_get("HOME", jobenv)) < 0)
src/do_command.c: if (cron_change_user_permanently(e->pwd, env_get("HOME", jobenv)) < 0)
src/popen.c: if (cron_change_user_permanently(pw, env_get("HOME", jobenv)) != 0)
src/security.c:int cron_change_user_permanently(struct passwd *pw, char *homedir) {
...それで、すべての場合において、HOME
環境変数はchdir
ユーザーの場所を決定するために使用されるように見え、そのchdir
ディレクトリには常に1つあります。したがって、そのHOME
ディレクトリが存在するかHOME
正しく設定されていることを確認する必要があります。今後 cron_change_user_permanently
呼び出されます(これはcronジョブのシェルコードが表示される前に発生する可能性があります)。 (またはcronie
他のタスクを実行するためのサルパッチですが、これはおそらく非常に悪い考えでしょう。)
答え2
cron
ユーザーの実行時にcrontab
ユーザーのホームディレクトリから起動しようとしています。変数の初期値は/etc/passwd
(簡単な場合)から来ます。HOME
アイテムを上書きしようとしたときにcrontab
$ cron
{HOME}を変更しようとしました。