Vor kurzem habe ich verwendet mv
, um eine große Menge von Dateien von meiner Festplatte auf ein Flash-Laufwerk zu verschieben. Ich habe vergessen, eine ausführliche Flagge hinzuzufügen, damit ich keine Ahnung hatte, "wo" der Umzug war und wie viele Transfers noch übrig waren.
Ich fand das strace
Dienstprogramm und entschied mich, es für meinen MV-Prozess zu verwenden. Mit Hilfe von konnte ps -ef | grep mv
ich die PID des Prozesses finden und lief dann strace -p [PID]
. Hier ist ein Beispiel von dem, was ich bekommen habe:
write(4, "\325\0\0s\1\1\224\0\0\0\0\0109\27\0\0\201\327\0\0\240H:\310xgM\337\274\26\"\273"..., 32768) = 32768
read(3, "\6\3319H\r\207\345\257\301JL)\2601C\t\303\22(\214\353\211\230;{\6\214\355nh@F"..., 32768) = 32768
write(4, "\6\3319H\r\207\345\257\301JL)\2601C\t\303\22(\214\353\211\230;{\6\214\355nh@F"..., 32768) = 32768
read(3, "ZK\301\332\263\214@\177\3352$\374\277];\255\265\364\240d\275\307P\237*\364\23\206\31\306\244\256"..., 32768) = 32768
write(4, "ZK\301\332\263\214@\177\3352$\374\277];\255\265\364\240d\275\307P\237*\364\23\206\31\306\244\256"..., 32768) = 32768
read(3, ".\341\355\32\366\7\365\244\4\4\221{c,$\246]\204\342\261\"\374K\234\264\17\26\346\246\327\347m"..., 32768) = 32768
und dann einige:
fcntl(3, F_GETFD) = 0
fcntl(3, F_SETFD, FD_CLOEXEC) = 0
fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
fcntl(3, F_GETFL) = 0x38800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_NOFOLLOW)
fcntl(3, F_SETFD, FD_CLOEXEC) = 0
fcntl(3, F_DUPFD, 3) = 4
fcntl(4, F_GETFD) = 0
fcntl(4, F_SETFD, FD_CLOEXEC) = 0
getdents64(3, /* 4 entries */, 32768) = 120
getdents64(3, /* 0 entries */, 32768) = 0
close(3) = 0
newfstatat(4, "The Pick of Destiny", {st_mode=S_IFDIR|0755, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
openat(4, "The Pick of Destiny", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 3
fcntl(3, F_GETFD) = 0
fcntl(3, F_SETFD, FD_CLOEXEC) = 0
fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
fcntl(3, F_GETFL) = 0x38800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_NOFOLLOW)
fcntl(3, F_SETFD, FD_CLOEXEC) = 0
fcntl(3, F_DUPFD, 3) = 5
fcntl(5, F_GETFD) = 0
fcntl(5, F_SETFD, FD_CLOEXEC) = 0
getdents64(3, /* 22 entries */, 32768) = 1008
getdents64(3, /* 0 entries */, 32768) = 0
close(3) = 0
Also, was genau gibt mir Strace? Sind das Kernel-Aufrufe? Wenn ja, was meinen sie (ich weiß, was Lesen und Schreiben tun, aber was sind diese Zahlen)?
Bonusfrage: Gibt es eine Möglichkeit für mich, etwas "Niedrigeres" als das zu sehen, was mir die Spannung zeigt? CPU-Aufrufe vielleicht?
lsof -p <pid>
, die Ihnen geöffnete Dateien und Zuordnungen eines Prozesses zeigt.Antworten:
Was
strace
Sie erhalten, sind Systemaufrufe - Anrufe, die den Kernel anfordern, können etwas tun, was der Prozess selbst nicht kann, z. B. das Öffnen von Dateien. (exfcntl
,close
etc sind in Ihrer Spur zu finden).fcntl (3, F_GETFD) = 0
Übersetzt in: Systemaufruf (fcntl) mit Argumenten (3, F_GETFD), die einen Wert (0) zurückgeben .
Sie meinen entweder 1) CPU-Interrupts oder 2) Montageanweisungen. Ich weiß es ehrlich gesagt nicht, aber:
strace
hat eine Manpage - Ich schlage vor, Sie lesen sie, wenn Sie Details zu ihrer Funktionsweise wünschen.quelle
Sie haben so ziemlich die richtige Antwort in Ihrer ursprünglichen Frage.
Das Standardverhalten von
strace
ist, zu melden, welche Systemaufrufe für diesen Prozess ausgeführt werden, es werden auch aufgerufene Signale gemeldet und welcher Handler dieses Signal behandelt hat.In Ihrem Beispiel sind die syscalls aufgerufen wird am Anfang der Zeile:
fcntl()
,getdents64()
close()
usw.Die Argumente, die diesen syscalls weitergegeben wurden , werden gezeigt - oft abgestumpften, da die Rohdaten Kilo sein kann / Mega / Giga - Bytes groß)
fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...})
(die...
schenkt das Abschneiden). Was diese Werte darstellen, ist von Syscall zu Syscall unterschiedlich, aber man zeigt, was sie darstellen (vorausgesetzt, Sie verfügen über die grundlegenden Manpages für die auf Ihrem System installierten Sys-Aufrufe).man 2 fstat
zeigt die Handbuchseite des Programmierers für fstat und erläutert die Argumente.Und das Ergebnis dieses Systemaufrufs
getdents64(3, /* 22 entries */, 32768) = 1008
1008
in diesem Fall. Der Wert dieses Ergebniscodes wird auf der man (1) -Seite des jeweiligen Systemaufrufs in der gleichen Weise dokumentiert, wie die Argumente detailliert sind. Beachten Sie in diesem Fall, dass/* 22 entries */
es sich um eine andere Kürzungsoperation handelt, die mit erweitert werden kann-e abbr=none
.Beachten Sie, dass
strace
nicht ein universeller Befehl ist, einige Versionen von Unix - Nutzungtruss
,ktrace
unddump
ähnliche Debuggen auf einen Prozess durchzuführen. Sie sollten auch einen Blick auf die Manpage Strace nehmen, es mit einigen erweiterten Optionen kommt (vielleicht wird dies Ihr schließen Bonus - Frage ) wie-i
(Druck den Befehlszeiger)-v
(Ausführlichkeit)-a
(den Standort wechseln - Säule - des Ergebnisses Teil um mehr der an den Befehl übergebenen Argumente zu sehen) und Ausdrucksfilterung-e
.edit hat einige Anmerkungen zu anderen Forms hinzugefügt, bei denen das Argument abgeschnitten wurde.
quelle