2016-09-22 4 views
0

私のCentOSでは、CPU USAGEとFREE MEMORYの出力番号をテキストファイルに出力しようとしています。しかし、私が端末に入力するとき、それはすべていいです。しかし、crontab経由で実行された場合、MEMORY出力は常に空白になります。ターミナルでLinuxスクリプト:Crontab経由でテキストファイルにメモリを保存すると常に空白になる

手動でタイピング:クローンタブで

# echo CPU: `top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}'`, RAM: `awk '/^Mem/ {print $4}' <(free -m)` >> ~/stats.txt 
# cat ~/stats.txt 
CPU: 3.8, RAM: 1307 

同じコマンド:

​​

なぜRAM出力は常に空白です:次に

*/10 * * * * echo CPU: `top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}'`, RAM: `awk '/^Mem/ {print $4}' <(free -m)` >> ~/stats.txt 

テキストファイル内のお願いします?

答えて

1

あなたのコマンドでプロセス置換を使用している:

<(free -m) 

。これは、標準のPOSIXシェルにはないBash機能であり、一部のプラットフォームではBashでさえありません。

SHELL変数をcrontabに設定して指定しない限り、cron/bin/shでコマンドを実行します。このように起動すると、bashはPOSIXシェルをエミュレートするのに最も適しています。それには、プロセスの置換を認めないことも含まれます。例えば、私の現在のシステム、上:あなたのコマンドは(おそらく)エラーを生成しているため

$ /bin/bash -c "awk '/^Mem/ {print \$4}' <(free -m)" 
11603 

しかし

$ /bin/sh -c "awk '/^Mem/ {print \$4}' <(free -m)" 
/bin/sh: -c: line 0: syntax error near unexpected token `(' 
/bin/sh: -c: line 0: `awk '/^Mem/ {print $4}' <(free -m)' 

、それはcronあなたがそのことについてメールで送信している可能性があります。

あなたのcrontabにSHELL=/bin/bashを設定することができますが、最初にプロセスの置換が必要な理由はわかりません。 awkは、ファイル名を指定しないと標準入力から読み込みます。したがって、freeの出力を簡単にパイプすることができます。

$ /bin/sh -c "free -m | awk '/^Mem/ {print \$4}'" 
11612 

対応するcrontabのラインが読み、そしてより多くの内部的に一貫性して(私にとって)より標準的な、簡単です

*/10 * * * * echo CPU: `top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}'`, RAM: `free -m | awk '/^Mem/ {print $4}'` >> ~/stats.txt 

だろう。

関連する問題