1

だから私は、確率が最も可能性の高いパスだと思います。しかし、これを正しく設定する方法については混乱しています。

したがって、私のスクリプトの上部は次のようになります。

#!/bin/sh


MYSQL="$(which mysql)"
if [ -z "$MYSQL" ]; then
    echo "Error: MYSQL not found"
    exit 1
fi

スクリプトをsshで実行すると、完全に機能します。しかし、cronをセットアップするとき、directadminで次のコマンドを使用します。

/home/username/script.sh

また試した:

/bin/sh /home/username/script.sh

どちらも次のエラーが発生します。

Error: MYSQL not found

だからここに私がオンラインで見つけたものがあります:

SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin 
HOME=/var/log

上記のステートメントの少なくとも1つをスクリプトに追加する必要があると思います。サーバーはfreebsdサーバーであり、すべてがデフォルトの場所にあると思います。whereis shを実行すると、/ bin/shが返されます。

PATHやホームを確認する方法がわかりません。私はfreebsdを初めて使用するので、どんな助けでも素晴らしいでしょう。

4

4 に答える 4

1

Crontabジョブはシステムによって送信され、通常のシステム起動スクリプト(PATHなどを設定する)を実行しません。

SolarisのKornシェルですべての作業を行い、すべてのスクリプトの先頭に次のような行を追加します。

#!/bin/ksh
#-------------------------------------------------------------------------------
# /opt/app/batch/daily_dns.ksh  Daily DNS Batch process via crontab
# 16 3 * * * /opt/app/batch/dns/bin/daily_dns.ksh > /opt/app/batch/daily_dns.log
#-------------------------------------------------------------------------------
. /etc/profile

あなたはおそらく同じようなことをする必要があります。

于 2013-02-17T17:56:49.747 に答える
0

私はDebianに精通しているだけなので、知識に基づいた推測をしているだけですが、cronはタスクをrootとして実行し、非対話的に実行します。これは、rootユーザーと同じパスを取得し、通常、パスが設定される前に非対話型プロンプトが.bash_profileから終了することを意味します。

TL; DR:rootユーザーがMYSQL変数を持っていることを確認し、rootユーザーの.bash_profileが非対話型プロンプトで終了しないことを確認してください。

于 2013-02-17T17:56:09.013 に答える
0

env(1)のマンページを読んで、問題の診断と修正の両方に使用するか、必要に応じてスクリプト内から環境を修正することができます。

あなたがそれがfreebsdサーバーであると言ったように、私の推測では、あなたはmysqlが/ usr/localの下にインストールされていると思います-これはcronのデフォルトの$PATHに含まれていません。

于 2013-02-18T16:12:54.817 に答える
0

これは PATH の問題によるものです。上記の回答に従って、crontab ファイル内でパス変数を指定するか、スクリプトを変更できます。

後者に決定する場合は、次の変更が必要です。

  1. 標準端末で「which」を実行して、システム上の「どの」ツールの正確なパスを確認します (通常は「/usr/bin/which」)。
  2. スクリプト内のコマンド「which」をフル パスに置き換えます。

これで、crontab で「 /bin/sh /path/to/your/script 」を使用してスクリプトを cron 化できます。この場合、crontab ファイルにパス変数を追加する必要はありません。

お役に立てれば。

于 2013-05-21T07:27:26.897 に答える