Bashスクリプトはrootでは機能しますが、crontabでは機能しません。

Bashスクリプトはrootでは機能しますが、crontabでは機能しません。

Linuxの起動時にbashスクリプトを実行しようとしても機能しません。私はcrontabで次のコマンドをすべて試しました。

@reboot bash /home/user/mysqlamazon.sh
@reboot sh /home/user/mysqlamazon.sh
@reboot /home/user/mysqlamazon.sh
@reboot sleep 60 && /home/user/mysqlamazon.sh

完全に動作するcrontabのための別のコマンドがあります。

@reboot pwsh file.ps1

私も次のコマンドを試しました。

@reboot pwsh file.ps1 && sh /home/user/mysqlamazon.sh

このうち何も動作しません!どんな助けでも大変感謝します!

以下はbashスクリプトの内容です。

while($true)
do
./transfermysql.sh > file.txt
bcp tablename in file.txt -S ***********.com,**** -U **** -P *********** -d ********* -c
:> file.txt
sleep 60
done

答え1

これがどのように失敗したかは教えてくれませんでしたが、実行されている様子は見えなかったようです。

while($true)まず、有効なシェル構文ではないため、スクリプトは機能しません。私はあなたが次のことをしたいと仮定します:

true=1
while(($true)); do ... ; done

より一般的なイディオムは次のとおりです。

while : ; do ... ; done

または(trueはコマンドです):

while true; do ... ; done

これは、スクリプトで相対パスを使用している可能性があります。

./transfermysql.sh > file.txt

フルパスに置き換えます。

/path/to/transfermysql.sh > /path/to/file.txt

次に、cronのPATHにないと思われるので、フルパスbcpも使用してください。

/path/to/bcp tablename in file.txt -S ***********.com,**** -U **** -P *********** -d ********* -c

最後に、最初のコマンドが内容を上書きするので、これをしたい理由がわかりません:> file.txt。ただし、何らかの理由で必要な場合は、そこでもフルパスを使用する必要があります> /path/to/file.txt

答え2

cronジョブは、またはを介してat実行されるか、batchデスクトップの同じランタイム環境では実行されません。変更やその他の環境変数の設定は、ジョブにPATH自動的に伝播されませんcron。たとえば、no$DISPLAYなので、GUIプログラムには特別な処理(読み取りman xhost)が必要です。

cron環境変数は、すべてのジョブの読み取りファイルで設定できます。crontabman 5 crontab

echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias各環境の結果を確認してください。

その行はデフォルトで解釈されるため、構文はcommandそれよりも単純なので、環境を設定した後に必要なプログラムを呼び出すスクリプト(実行可能、インストール、開始)を呼び出すことをお勧めします。crontab/bin/sh/bin/bashcommandbash#!/bin/bash

関連情報