Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: Linux Forum Linux-Web.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

17.06.2009, 15:44

[gelöst] kleines Problem mit Ausgabe ps in Datei

Hallo,

ich benutze in einem Skript automatisiert zum Systemmonitoring folgenden
Befehl:

Quellcode

1
2
3
4
5
6
7
8
9
10
# wegen Übersichtlichkeit hier in Zeilen aufgeteilt

ps -eo 
pid,ppid,fuser=USER,priority=PRs,pri=PRe,ni,s,stat,%cpu,
cputime=CPU-TIME,etime=STARTED,%mem,rss=MemR-kb,vsz=MemV-kb,
size=SWAP-kb,f=FL,policy=SCD,
psr=CORE,sgi_p,nlwp,maj_flt=PFm,sz=PAGE,pagein=PGin,ucomm 
--sort=s,-%cpu --cols 200

# auch --cols=200 oder --columns 200 bringen keine Änderung


Es funktioniert soweit alles einwandfrei, nur ist die Ausgabe in die Datei auf 150 Zeichen beschränkt.
Der Parameter --cols scheint nur bei Screenausgaben eine Wirkung zu haben.

Ich habe verschiedene Einstellungen und Kombinationen mit den evn-Variablen
TERM und COLUMNS versucht, aber diese wirken sich bei Dateiausgabe ebenfalls nicht aus.

In den man-Pages steht dazu leider ebenfalls nichts Wesentliches, ausser das COLUMNS und der Parameter --cols die Ausgabe beeinflussen können.

Quellcode

1
2
3
4
5
When specified last, this column will extend to the edge of the display. 
If ps can not determine display width, as when output is
redirected (piped) into a file or another command, the output width is undefined. 
(it may be 80, unlimited, determined by the TERM variable, and so on) 
The COLUMNS environment variable or --cols option may be used to exactly determine the width in this case. The w  or -w option may be also be used to adjust width.



Es macht auch keinen Unterschied, ob ich die Option ucomm als letzte Option oder irgendwo in der Mitte angebe. Der Parameter --width hat nur Auswirkungen bei der Screenanzeige.

Ist das hier ein Hardlimit im ps-Programm (150) oder gibt es noch eine Stellschraube, an der die Dateiausgabe verändert werden kann ?

Merci für einen Tipp.
Mike

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

2

17.06.2009, 20:10

RE: kleines Problem mit Ausgabe ps in Datei

willst du behauoten, das von der ps-ausgabe nur 150zeichen in der datei landen?? oder meinst du zeilen?????
deine formulierung ist sehr unklar.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

3

17.06.2009, 22:33

sorry,

ich meine Zeichen in der Breite.

Beispiel:

Quellcode

1
2
3
 9286  9283 root      16  23   0 S S     0.0 00:00:18  2-20:51:04  0.0     368    1472     196  0 TS     0 *    1      0   368      0 qmail-local.mov

# es sollte qmail-local.moved heissen


Die Angabe einer indiv. Spaltenbreite im Befehl (z.B. ps -ewwo pid,[...],ucomm:40) bringt dennoch keine 40 Zeichen Ausgabe von ucomm.
Auf der Console direkt: ja, in der Datei nicht.

Exakt in Spalte (also Zeichen) 150 wird hinten gekürzt.

Benutze ich anstelle ucomm z.B. args, dann wird der komplette Programmaufruf inkl. aller Parameter am Bildschirm dargestellt.
In der Datei (Ausgabe erfolgt mit ps ... > datei) wird bei 150 gestoppt.

Im Anfangsbeispiel:
wenn ich einzelne Optionen aus dem PS-Parametern rausnehme (z.B. kein pid...), dann spare ich n Zeichen platz, diese bekomme ich durch eine Verlängerung der letzten Option (also ucomm) dazu, aber insgesamt eben auch nur max. 150 Zeichen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MIKE bt« (17.06.2009, 22:36)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

4

17.06.2009, 23:27

die ausgabezeile ist bei dem befehl nur maximal 150zeichen lang. füge zb %mem mit ein und du wirst sehen, dass die zeilen länger werden. wenn du die kommandos ganz ausgegeben haben möchtest, dann benutze args statt ucomm.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

5

17.06.2009, 23:49

heisst das, jede Spalte (Wert) hat eine fixe Zeichenzahl bei der Ausgabe ?

Wozu dient dann der Wertparameter option1,option2:breite,option3 .. ?

Also: ein genereller Unterschied zwischen Ausgabe -> Console, Ausgabe -> Datei, oder ?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MIKE bt« (17.06.2009, 23:50)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

6

18.06.2009, 00:07

Zitat

Original von MIKE bt
heisst das, jede Spalte (Wert) hat eine fixe Zeichenzahl bei der Ausgabe ?

ja, es gibt eine voreingestellte fixe zeichenzahl für die einzelnen spalten.

Zitat

Wozu dient dann der Wertparameter option1,option2:breite,option3 .. ?

um bei einer reihe von spalten die breite zu verändern, zb wchan

Zitat

Also: ein genereller Unterschied zwischen Ausgabe -> Console, Ausgabe -> Datei, oder ?
nein, wieso?
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

7

18.06.2009, 02:53

Das mit den fixen Werten habe ich nicht gewusst und auch noch nirgendwo gelesen.

Aber gut.

Das bedeutet, ucomm hat z.B. 20 Zeichen.
In der Dateiausgabe ps -ewwo pid,wie_im_ersten_posting,ucomm:40 --cols 200 > datei

bringt mir immer maximal 150 Zeichen, weil das die Summe der fixen Werte der einzelnen benutzten Options-Kennzeichner ist.

An der Konsole - gleicher Befehl - ist aber dynamisch, d.h., die letzte Spalte - im Beispiel ucomm - bringt den vollen Eintrag des betreffenden Programmes und bricht _NICHT_ bei 150 ab.

Somit gibt es einen Unterschied zwischen Dateiausgabe und Screenausgabe.

Die Alternative mit args ist nicht so gut, weil ich dann diesen Ausgabestring massiv einzeln bearbeiten muss.

Skripte haben bei mir die Bezeichnung
performance_class12_create.sh

Ich brauche den entsprechenden Programmnamen, um in der Anzeige (das Monitoringskript generiert eine Website) neben den ganzen ausgewählten Werten anzeigt.
Wenn hier ucomm immer abschneidet, bekomme ich 7 Einträge mit performance_cla,
gebe ich es mit args aus, muss ich erstmal die ganzen Aufrufpfade prüfen+entfernen, die nachfolgenden Parameter etc. prüfen und ggf. entfernen.

Ganz schön viel Aufwand, nur weil jemand auf die schlaue Idee gekommen ist, hier feste Werte für einzelne Spalten anzugeben (was imho überflüssig ist, wenn man die Möglichkeit hat, mittels :breite eine indiv. Formatierung vorzunehmen).

Na gut.
Also kein Fehler, sondern auf diesem Weg schlicht nicht umsetzbar.

PS:
die Erkenntnis mit den fixen Anzahl Zeichen pro Wert:
woher bekommt man(n) die ?
Ich habe zu ps die man-Pages x-mal gelesen, im Internet zahlreiche Docs dazu befragt und auch in meinen Büchern steht dazu absolut nichts.

Selbst ein Profi muss sein Wissen ja irgendwann mal irgendwoher bezogen haben.

Danke jedenfalls für die Hilfe.

Mike

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

8

18.06.2009, 13:07

hmmm,
du hast schon recht. wenn du zb cmd voch vor pid in die liste einfügst, dann beachtet er auch eine formatierungsangabe, zb cmd:30, eine reihe von prozessnamen werden aber trotzdem abgeschnitten.
die formatierungsangabe wird also beachtet, ausser wenn comm als letzte option angegeben wird, dann werden offensichtlich überzälige spaces weggeschnitten. die kürzung der prozessnamen passiert also nicht bei der formatierung der ausgabe, sondern an anderer stelle.
auch die in der manpage angegeben umgebungsvariablen führen da nicht weiter.
vielleicht wäre mal ein blick in die dokus der sourcen oder direkt in den sourcecode sinnvoll.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »linuxerr« (18.06.2009, 13:31)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

9

18.06.2009, 13:44

Zitat

Original von MIKE bt

Skripte haben bei mir die Bezeichnung
performance_class12_create.sh

Ich brauche den entsprechenden Programmnamen, um in der Anzeige (das Monitoringskript generiert eine Website) neben den ganzen ausgewählten Werten anzeigt.

wenn du nur nach speziellen prozessen suchst, dann könntest du ja auch -C verwenden, also
ps -C performance_class12_create.sh blahblahblah >
ps -C performance_class11_create.sh blahblahblah >

und hättest je eine tabellenausgabe zu dem entsprechenden script.

ansonsten ist das herausschneiden des scriptnamen aus dem long-format (args) auch nicht die hürde.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

10

18.06.2009, 18:21

Zitat

Original von linuxerr

ansonsten ist das herausschneiden des scriptnamen aus dem long-format (args) auch nicht die hürde.


für'nen Profi nicht, ich muss mich damit schon etwas beschäftigen.

Ich brauche leider alle laufenden Programme, somit kann gezielt die Namenseingrenzung nicht benutzt werden.

Aber gut. Wieder was gelernt, das separieren der passenden Infos aus args werde ich hinbekommen.

Danke Dir (mal wieder) für die Hilfe.

Mike

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

11

18.06.2009, 18:34

Zitat

Original von MIKE bt
das separieren der passenden Infos aus args werde ich hinbekommen.


am besten du machst das mit cut und/oder der bash-parametersubstitution
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

12

18.06.2009, 19:00

awk ist vielleicht am effizientesten
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

13

18.06.2009, 19:11

habs mir gerade mal genauer angeschaut, was da alles ausgegeben wird.
Ist schon sehr unterschiedlich, eine einheitliche Struktur ist da nicht vorhanden.

Werde es mal so probieren:

cut: auf das 1. Leerzeichen trennen, dann beide Teile bearbeiten

1. Teil: die Pfadangaben entfernen
2. Teil: wenn mit einem - | / beginnt, den teil vergessen, ansonsten hier wieder nach
Leerzeichen aufspalten, 2. Teil davon wegwerfen, den ersten Teil dann aufbereiten. Das ganze dann mit 40 Zeichen limitiert ausgeben.

Ich denke, da müsste ich die meisten Ausgaben damit abdecken können.

Wobei dann sowas wie

Quellcode

1
32464 /usr/lib/courier-imap/couriertcpd -address=0 -stderrlogger=/usr/sbin/courierlogger -stderrloggername=imapd -maxprocs=40 -maxperip=4 -pid=/var/run/imapd


nach obiger Bearbeitung
1. Teil: /usr/lib/courier-imap/couriertcpd
2. Teil: -address=0 -stder (also verwerfen)

ergeben würde:
couriertcpd

und somit die eigentliche Info courier-imap schon wieder fehlt.

Hmm....

PS:
mit sed alles zwischen dem 1. und dem letzten Auftreten eines Zeichens (/) rauszuwerfen, ist auch nicht ganz ohne, zumal wenn man nicht weiss, wieviele / drinnen sind.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MIKE bt« (18.06.2009, 19:16)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

14

19.06.2009, 09:25

Quellcode

1
ps blahblah |  sed -e 's/\/.*\///g' 
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

16

20.06.2009, 14:27

bitte sehr :)
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

Thema bewerten