Wenn Sie auf debian sind, können Sie das acct
Installationspaket , um Prozess - Accounting zu aktivieren, aber feststellen , dass weder lastcomm --debug
noch dump-acct
zeigt etwas wie der Exit - Status oder das Signal , das einen Prozess beendet.
Wenn Sie diese Daten abrufen möchten, können Sie ein Skript wie das folgende verwenden:
$ cat pacct.pl
#! /usr/bin/perl
use strict;
use Config;
printf "%-7s %6s %6s %8s %8s %s\n",
'STATUS', 'UID', 'PID', 'BTIME', 'ETIME', 'COMMAND';
my @sig = split ' ', $Config{sig_name};
$/ = \64;
while(<>){
my @f = unpack 'CCSL6fS8A*', $_;
my ($flag, $version, $tty, $exitcode, $uid, $gid, $pid, $ppid,
$btime, $etime, $utime, $stime, $mem, $io, $rw,
$minflt, $majflt, $swaps, $cmd) = @f;
my $s = $exitcode & 0x7f;
my $status = $s ? "SIG$sig[$s]" : $exitcode >> 8;
printf "%-7s %6d %6d %02d:%02d:%02d %8.2f %-16s\n",
$status, $uid, $pid,
(localtime $btime)[2,1,0],
$etime / 100,
$cmd;
}
# perl pacct.pl /var/log/account/pacct
# tail -f /var/log/account/pacct | perl pacct.pl
Dies setzt die Version 3 des Protokolldateiformats voraus - siehe acct.h
.
Beachten Sie jedoch, dass dies nicht so nützlich ist, da nur der Prozess- / Thread-Name in der Protokolldatei enthalten ist (dh der Basisname der ausführbaren Datei, der auf 15 Byte abgeschnitten ist und mit dem leicht gefälscht werden kann prctl(PR_SET_NAME)
), nicht der Pfad des ausführbare Datei oder die Argumente, mit denen es aufgerufen wurde.
Wenn Sie erweitern möchten , dass Skript auch die Anzeige stime
, utime
etc Felder, kann dies nützlich sein:
# translate comp_t to float
# utime, stime, mem, minflt, majflt are in the comp_t format
# io, rw, swaps are never set; they're purely decorative
sub comp2f {
my $m = $_[0] & 0x1fff; my $e = $_[0] >> 13; $m * 8 ** $e;
}
Hinweis: Anstatt das acct
Paket zu installieren , können Sie die Prozessabrechnung auch aktivieren mit:
# mkdir /var/log/account
# perl -e 'require "syscall.ph"; my $f = shift;
open my $h, ">>", $f or die "open >>$f: $!" if $f;
$! = -syscall SYS_acct(), $f // 0 and die "acct $f: $!";
' /var/log/account/pacct
execve()
Aufruf des Prozesses auf die ersten 15 Bytes des Basisnamens der ausgeführten Datei). Sie können es nicht durch Überschreiben ändernargv[0]
, sondern mitprctl(PR_SET_NAME, newname)
oderexecve()
. Wenn Sie dies tunenv sh -c 'exec bash -c "exit 123"'
, ist dies ein Prozess, der der Reihe nach ausgeführt wirdenv
,sh
undbash
. Das Pacct-Protokoll zeigt nur einen Eintrag fürbash
(den Namen des Prozesses zum Zeitpunkt desDas
ist ziemlich nah an dem, was Sie wollen; es wird
Wenn Sie also 40 Befehle zusammen geleitet haben und der dritte Befehl einen Rückkehrcode von 8 ergibt und der Rest erfolgreich abgeschlossen wurde, wäre der Gesamtrückgabecode 8. Es wäre schwierig herauszufinden, welcher Befehl den schlechten Rückkehrcode gegeben hat.
quelle