web-dev-qa-db-ja.com

UbuntuとRHELでのBashの奇抜さ

仲間の障害者、

RHEL 5.4ボックスで開発した1つのライナーで遊んでいますが、完全に機能しています。

TOTAL_RAM=`free | grep Mem: | awk '{ print $2 }'`; \ 
ps axo rss,comm,pid | awk -v total_ram=$TOTAL_RAM \
'{ proc_list[$2] += $1; } END { for (proc in proc_list) \
{ proc_pct = (proc_list[proc]/total_ram)*100; 
printf("%d\t%s\t%0.2f%\n", proc_list[proc],proc,proc_pct); }}' \
| sort -n | tail -n 10

これは私のRHELボックスに次のようなものを出力します:

3736    logmon  0.01%
4156    EvMgrC  0.01%
4692    hald    0.01%
5020    ntpd    0.02%
6252    sshd    0.02%
7784    cvd     0.02%
9224    snmpd   0.03%
13068   dsm_sa_datamgr3 0.04%
23320   dsm_om_connsvc3 0.07%
4249864 mysqld  12.90%

しかし、私のUbuntu 9.04スライスでは、次のようになります。

awk: run time error: not enough arguments passed to printf("%d  %s      %0.2f%
")
        FILENAME="-" FNR=104 NR=104
33248   console-kit-dae 3.17

何かを壊しているのはbashである必要があると思いますが、thatbash固有である必要があることは実際には何もしていません。 RHELボックスが実行されています:

# yum info bash | grep -e Version -e Release
Version    : 3.2
Release    : 24.el5

そしてUbuntuボックス:

# apt-cache show bash | grep -e Version
Version: 3.2-5ubuntu1

私はこれを深く掘り下げたことがなく、あなたがこれまでにこれに遭遇したことがあるかどうかを確認するために、仲間のジョニーにpingを送信すると思いました。

/弓

4
d34dh0r53

このコマンドは各システムで何を表示しますか?

echo $BASH_VERSION

エラーメッセージはawkによって生成されているため、これは何を示していますか。

awk --version | head -n 1

chris'sprintfの最後の%をエスケープするための提案(バックスラッシュまたはパーセント記号を2倍にすることで実行できます)に加えて、おそらくprintfの前の行末の行継続バックスラッシュ。

私が言えるのは、Ubuntu9.10では完全に正常に機能するということだけです。しかし、あなたの4番目の%記号は、私には少し奇妙に見えます-完全に指定されていない動作に依存しているように見えます。逃げるべきではないですか?

TOTAL_RAM=`free | grep Mem: | awk '{ print $2 }'`; \ 
ps axo rss,comm,pid | awk -v total_ram=$TOTAL_RAM \
'{ proc_list[$2] += $1; } END { for (proc in proc_list) \
{ proc_pct = (proc_list[proc]/total_ram)*100; 
printf("%d\t%s\t%0.2f%%\n", proc_list[proc],proc,proc_pct); }}' \
| sort -n | tail -n 10
2
Chris Lercher

メモリの割合を探しているだけの場合は、次のことができます。

top -b -n1

あなたはいくつかの追加情報を得るでしょう、しかしそれは目覚めるのがより簡単です。 Topは、すべてのcursesジャンクが他のアプリケーションにパイプされないようにバッチモードを許可します。

0
McJeff