Codekritik
Da der Shebang die bash als Interpreter benennt, sollte man auch bash Syntax verwenden.
Die POSIX Syntax ist schwerer lesbar, außerdem sind viele bash Konstrukte wesentlich leistungsfähiger.
Das export LANG="en_US.UTF-8" ist eher hinderlich.
Es ist nicht garantiert, dass diese Locale installiert ist.
Besser ist ein LANG=C, was garantiert auch auf japanischen Maschinen problemlos funktionieren wird.
Überflüssig ist die Zeile export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin, da das sowieso Standard ist.
Will man das als Systemtool schreiben, so nimmt man schlicht absolute Pfade.
Man sollte keine Variablen in all uppercase verwenden.
Das sind per Konvention System Environment Variablen.
Diese Unsitte hält sich seit Anbegin der Shellprogrammierung hartnäckig.
Allzu leicht überschreibt man dabei auch tatsächliche Systemenvrionmentvariablen.
Um sowas zu vermeiden, verwende man für eigene Variablen Kleinbuchstaben und Unterstriche, wie man unter Bashisten übereingekommen ist, oder CamelCase.
Das hier ist einfach schlechter Stil: SUM=0; OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"` ; Hier ist die Posixsyntax mit den Backticks zu bemängeln. Sehr viel leichter ist die Bashsyntax $( someCommand ) zu lesen.
Die Pipe zu grep ist überflüssig, da find selbst Reguläre Ausdrücke beherrscht.
Ein find -maxdepth 1 -type d -a -name '[0-9]*' tut das Gleiche, ohne den Overhead von Pipe und weiterem Grep-Prozess.
Nicht berücksichtigt sind dabei übrigens Verzeichnisse, bei denen nach den Zahlen noch Buchstaben kommen würden. Mag zur Zeit belanglos sein, aber dennoch erwähnenswert.
Dann kommt diese Zeile: PID=`echo $DIR | cut -d / -f 3`
Du schneidest aus dem Pfadnamen das Ende (also die Pid) heraus, indem du die Pfadnamen durchläufst und jeden zu cut pipest.
Ganz ohne Kontextwechsel und Pipe kann das die Bash selbst mit ParameterExpansion wesentlich schneller:
Später folgt dann diese Zeile: for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'
Aus jedem Verzeichnis liest du die Datei "smaps", greppst daraus die Zeilen, die das Wort "Swap" enthalten und lässt wieder nach einer Pipe awk das zweite Datenfeld ausgeben.
All das kann man mit einem einzigen awk- Befehl für ALLE Verzeichnisse erledigen:
Diese Lösung verwendet nur awk und das Globbing der Bash.
Man könnte das ganze Script, also auch das Aufsummieren des Swaps, das Herausschneiden der Pids und das Finden der gesamten Kommandozeile des jeweiligen Prozesses komplett in einem kleinen awk Scriptchen erledigen.
Das wäre erheblich viel schneller und würde auf viel Ressourcenverschwendung durch überflüssige Kontextwechsel, Piperei und dergleichen verzichten.
Was im Ernstfall für so ein Script nicht unerheblich wäre, wie einige Vorposter ja schon schrieben.