Commandes utiles : différence entre times / time?

hi,

Je suis en train de fouiner à la recherche de “curiosités” utiles. Des commandes pas forcément les plus utilisés et pourtant bien pratiques.

time me parait être de celles là. Or les infos que je trouve sont assez succintes :

Pour chronométrer une tâche, on utilise donc la commande time suivi de la tâche.
Ne pas confondre avec “times” qui est effectivement une autre commande.
times - Obtenir les statistiques temporelles du processus
time - Permet de mesurer le temps nécessaire à une commande.

Les résultats différent sensiblement :

sh-3.1# time cat mbox
(…)
real 0m0.249s
user 0m0.000s
sys 0m0.000s

sh-3.1# times cat mbox
0m0.052s 0m0.172s
0m20.985s 0m11.457s

Quelqu’un saurait-il, par hasard, bien me définir la différence entre les deux? Dans les deux cas, il me semble qu’on a le temps d’exécution d’une commande entre le moment où on lance cette commande et le moment du résultat.

.

times inclut est le temps total de traitement y compris le traitement de la chaine de commande. time lui se contente juste du programme proprement dit sans le temps de traitement bash. times est interne à bash, time est un binaire

Aaah, merci à tous les deux pour les explications.

Prenons le cas de l’affichage d’une page Web (j’ai vu le cas de figure, raison pour laquelle j’ai trouvé interressante cette commande).

#time printf ‘GET / HTTP/1.1\nHost:www.google.fr\n\n’ | nc -w 10 -q 10 google.fr 80 1>/dev/null

Cette commande, n’est ce pas, je n’en suis pas l’auteur (un jour, je serai assez tordu pour ça mais, pas encore LOL) : je l’ai trouvé sur le Web, et l’ai ensuite adapté à mes besoins (bon, en fait, c’est dans le cadre d’un problème assez précis : un client - pas google - qui voyait la construction de ses pages varier du simple au triple).

Toutefois, si on la décortique un peu :

On “écrit” en entrée ce qui suit:
#printf 'GET / HTTP1.1\nHost:www.google.fr\n\n’
GET / HTTP1.1
Host:www.google.fr

Qu’on rebalance en fait en sortie en direction d’un netcat.
Si on prends celle-ci à part :
#nc -w 10 -q 10 google.fr 80
head

400 Bad Request <!-- body {font-family: arial,sans-serif} div.nav {margin-top: 1ex} div.nav A {font-size: 10pt; font-family: arial,sans-serif} span.nav {font-size: 10pt; font-family: arial,sans-serif; font-weight: bold} [...] (Je requête l'en-tête pour voir le résultat).

nc (netcat) est une commande qui permet une connexion tcp… ou udp (avec l’option -u), contrairement à telnet.

Ici, nous avons donc établi une connexion avec le site, sur - logiquement - le port 80.

L’option -w représente le temps de la connexion (ici 10 secondes).
L’option -q représente aussi une durée : 10 secondes d’attentes après l’instruction End Of File. Et visiblement, on renvoie le résultat du canal de sortie standard (sans le “1”, on obtient le même résultat, non?) dans la corbeille (l’idée n’étant pas vraiment d’obtenir du code html mais le résultat de “time”… C’est ainsi que je l’interprète, en tout cas).

Je l’avoue clairement : je ne comprends pas très bien l’objet de l’option -q, ici, même si la première, -w, peut avoir du sens (je vais dire pourquoi après).

L’idée était de savoir exactement combien de temps mettait ses pages à se construire. C’est pourquoi indiquer une durée de 10 secondes est plutôt pas mal, j’imagine : cela permet d’obtenir une durée substentielle max sur laquelle greffer sa requête time.

Au final, les deux commandes, avec le pipe, nous permet d’établir une brève connexion, en ligne de commande, avec le site et d’y faire une requête GET.

Le printf et le \n évoque l’utilisation soit du perl, soit du Bash, soit du c. Etant donné que le c doit être compilé et étant donné que visiblement, il n’y a pas de “perl -e” et que la bécane comprends tout de suite de quoi il s’agit, je parierai pour tu Bash.

Donc si je m’en tiens à l’explication précédente (merci Fran.b). “time” aura l’avantage de ne compter que le temps d’exécution de la page sans y inclure le temps d’exécution du script de la commande, en substance. “times” incluerera tout, pour sa part.
Ce qui nous permet donc d’obtenir un résultat encore plus fin.

It’s that?
:slightly_smiling:

Et si la commande met 3 jours à s’exécuter, on utilise date à la place :smt005
OK, je sors …

Tiens, bonne idée, ça. Je vais faire un “date” sur le port 80…

:mrgreen: :mrgreen: :mrgreen:

(Remarque si tu fais “une date” sur un site porno, c’est pareil, non? … )

.

Hello tellemewhy,

En fait, je te rassure, ça prends pas trois heures… Par exemple :

Odysseus-2001@Monstre:~$ time printf ‘GET / HTTP/1.1\nHost:www.google.fr\n\n’ | nc -w 10 -q 10 www.google.fr 80 1>/dev/null

real 0m0.189s
user 0m0.000s
sys 0m0.004s
Odysseus-2001@Monstre:~$ time printf ‘GET / HTTP/1.1\nHost:www.mad-movies.com\n\n’ | nc -w 10 -q 10 www.mad-movies.com 80 1>/dev/null

real 0m0.152s
user 0m0.000s
sys 0m0.004s

si j’ajoute un strace (que Fran.b m’avait déjà fait découvrir :slightly_smiling: - mais l’interpréter c’est autre chose):

strace time printf ‘GET / HTTP/1.1\nHost:www.mad-movies.com\n\n’ | nc -w 10 -q 10 www.mad-movies.com 80 1>/dev/null
execve("/usr/bin/time", [“time”, “printf”, “GET / HTTP/1.1\nHost:www.mad-mov”…], [/* 14 vars */]) = 0
uname({sys=“Linux”, node=“Monstre”, …}) = 0
brk(0) = 0x504000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b46fd629000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=39579, …}) = 0
mmap(NULL, 39579, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b46fd62b000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/libc.so.6", O_RDONLY) = 3
read(3, “\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\305”…, 640) = 640
lseek(3, 624, SEEK_SET) = 624
read(3, “\4\0\0\0\20\0\0\0\1\0\0\0GNU\0\0\0\0\0\2\0\0\0\6\0\0\0”…, 32) = 32
fstat(3, {st_mode=S_IFREG|0755, st_size=1286104, …}) = 0
mmap(NULL, 2344904, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2b46fd72a000
mprotect(0x2b46fd84b000, 1161160, PROT_NONE) = 0
mmap(0x2b46fd94b000, 98304, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x121000) = 0x2b46fd94b000
mmap(0x2b46fd963000, 14280, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2b46fd963000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b46fd967000
mprotect(0x2b46fd94b000, 86016, PROT_READ) = 0
arch_prctl(ARCH_SET_FS, 0x2b46fd9676d0) = 0
munmap(0x2b46fd62b000, 39579) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x2b46fd967760) = 17172
rt_sigaction(SIGINT, {SIG_IGN}, {SIG_DFL}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_IGN}, {SIG_DFL}, 8) = 0
wait4(4294967295, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, {ru_utime={0, 0}, ru_stime={0, 0}, …}) = 17172
— SIGCHLD (Child exited) @ 0 (0) —
rt_sigaction(SIGINT, {SIG_DFL}, {SIG_IGN}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_DFL}, {SIG_IGN}, 8) = 0
write(2, “0.00”, 40.00) = 4
write(2, “u”, 1u) = 1
write(2, “s”, 1s) = 1
write(2, “e”, 1e) = 1
write(2, “r”, 1r) = 1
write(2, " ", 1 ) = 1
write(2, “0.00”, 40.00) = 4
write(2, “s”, 1s) = 1
write(2, “y”, 1y) = 1
write(2, “s”, 1s) = 1
write(2, “t”, 1t) = 1
write(2, “e”, 1e) = 1
write(2, “m”, 1m) = 1
write(2, " ", 1 ) = 1
write(2, “0:00.00”, 70:00.00) = 7
write(2, “e”, 1e) = 1
write(2, “l”, 1l) = 1
write(2, “a”, 1a) = 1
write(2, “p”, 1p) = 1
write(2, “s”, 1s) = 1
write(2, “e”, 1e) = 1
write(2, “d”, 1d) = 1
write(2, " ", 1 ) = 1
write(2, “?%”, 2?%) = 2
write(2, “C”, 1C) = 1
write(2, “P”, 1P) = 1
write(2, “U”, 1U) = 1
write(2, " ", 1 ) = 1
write(2, “(”, 1() = 1
write(2, “0”, 10) = 1
write(2, “a”, 1a) = 1
write(2, “v”, 1v) = 1
write(2, “g”, 1g) = 1
write(2, “t”, 1t) = 1
write(2, “e”, 1e) = 1
write(2, “x”, 1x) = 1
write(2, “t”, 1t) = 1
write(2, “+”, 1+) = 1
write(2, “0”, 10) = 1
write(2, “a”, 1a) = 1
write(2, “v”, 1v) = 1
write(2, “g”, 1g) = 1
write(2, “d”, 1d) = 1
write(2, “a”, 1a) = 1
write(2, “t”, 1t) = 1
write(2, “a”, 1a) = 1
write(2, " ", 1 ) = 1
write(2, “0”, 10) = 1
write(2, “m”, 1m) = 1
write(2, “a”, 1a) = 1
write(2, “x”, 1x) = 1
write(2, “r”, 1r) = 1
write(2, “e”, 1e) = 1
write(2, “s”, 1s) = 1
write(2, “i”, 1i) = 1
write(2, “d”, 1d) = 1
write(2, “e”, 1e) = 1
write(2, “n”, 1n) = 1
write(2, “t”, 1t) = 1
write(2, “)”, 1)) = 1
write(2, “k”, 1k) = 1
write(2, “\n”, 1
) = 1
write(2, “0”, 10) = 1
write(2, “i”, 1i) = 1
write(2, “n”, 1n) = 1
write(2, “p”, 1p) = 1
write(2, “u”, 1u) = 1
write(2, “t”, 1t) = 1
write(2, “s”, 1s) = 1
write(2, “+”, 1+) = 1
write(2, “0”, 10) = 1
write(2, “o”, 1o) = 1
write(2, “u”, 1u) = 1
write(2, “t”, 1t) = 1
write(2, “p”, 1p) = 1
write(2, “u”, 1u) = 1
write(2, “t”, 1t) = 1
write(2, “s”, 1s) = 1
write(2, " ", 1 ) = 1
write(2, “(”, 1() = 1
write(2, “0”, 10) = 1
write(2, “m”, 1m) = 1
write(2, “a”, 1a) = 1
write(2, “j”, 1j) = 1
write(2, “o”, 1o) = 1
write(2, “r”, 1r) = 1
write(2, “+”, 1+) = 1
write(2, “194”, 3194) = 3
write(2, “m”, 1m) = 1
write(2, “i”, 1i) = 1
write(2, “n”, 1n) = 1
write(2, “o”, 1o) = 1
write(2, “r”, 1r) = 1
write(2, “)”, 1)) = 1
write(2, “p”, 1p) = 1
write(2, “a”, 1a) = 1
write(2, “g”, 1g) = 1
write(2, “e”, 1e) = 1
write(2, “f”, 1f) = 1
write(2, “a”, 1a) = 1
write(2, “u”, 1u) = 1
write(2, “l”, 1l) = 1
write(2, “t”, 1t) = 1
write(2, “s”, 1s) = 1
write(2, " ", 1 ) = 1
write(2, “0”, 10) = 1
write(2, “s”, 1s) = 1
write(2, “w”, 1w) = 1
write(2, “a”, 1a) = 1
write(2, “p”, 1p) = 1
write(2, “s”, 1s) = 1
write(2, “\n”, 1
) = 1
exit_group(0) = ?
Process 17171 detached

On voit bien :
-L’exécution de la commande /usr/bin/time
-Qui exécute la machine : le système et le nom de ma bécane.
-Les bibliothèque accédée : ld.so.nohwcap, ld.s.preload
-une utilisation de nmap (là je suis un peu plus surpris : nmap est un paquetage que j’ai installé à la mano.
Si je ne l’avais pas fait, il se serait passé quoi?).
-On voit l’utilisation d’un descripteur de fichier dans open() en lecture seule - si je pige bien, il s’agit de lire
les librairies.
-le positionnement de la tête de lecture dans le fichier (lseek) et la lecture depuis le descritpteur (read)
-Le read(3, “\4\0\0\0\20\0\0\0\1\0\0\0GNU\0\0\0\0\0\2\0\0\0\6\0\0\0”…, 32) = 32
ne me parle pas vraiment. On lit quoi, ici? Du binaire? Est-ce le contenu du fichier?
-Le mprotect vérifierait un accès - pour vérifier l’identité de celui qui lance la commande?
-clone crée un processus fils (child_stack?)
-le write envoie un message lettre par lettre - je ne vois pas à qui, sans doute à la machine distante. je ne sais pas
à quoi correspondent les 1a, 1p, 1c, etc. Une traduction en hexa?

D’autres part les “=0” et les “=1” correspondent à quoi?

.

tkt, je vais chercher. Souvent je pose des questions ici et je cherche en parallèle.

Merci pour “nmap()”. En fait j’ai pensé au paquetage nmap. Je ne savais pas qu’il y avait un appel système du même nom. je sais ce qu’est un appel système. Les interpréter, c’est autre chose, n’ayant pas étudié la question.

:slightly_smiling:

Tiens dans les commandes marrantes, j’avait trouvé “tac”. L’inverse de “cat” (le fichier étant lu dans l’autre sens).

Si tu connais des commandes utiles mais méconnues, n’hésite pas : ça m’intéresse. Moi je continue de chercher. :slightly_smiling:

Je suis en train de faire quelques recherches sur “ab” - commande réseau qui semble récupérer pleins d’infos interessante en requêtant sur des serveur Web.

cyberciti.biz/tips/howto-per … erver.html

Faut que j’en sache plus…

.

Tiens typiquement, je fais une requête de ce type sur le sithe sithclan.net et j’obtiens :

Monstre:~# ab -n 1000 -c 5 sithclan.net/SC4/accueil/index.php?templat e=black_html
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, zeustech.net/
Copyright 2006 The Apache Software Foundation, apache.org/

Benchmarking www.sithclan.net (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests

e=black_htmlb -n 1000 -c 5 sithclan.net/SC4/accueil/index.php?template
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, zeustech.net/
Copyright 2006 The Apache Software Foundation, apache.org/

Benchmarking www.sithclan.net (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests

Server Software: Apache/2.2.9
Server Hostname: www.sithclan.net
Server Port: 80

Document Path: /SC4/accueil/index.php?template=black_html
Document Length: 46848 bytes

Concurrency Level: 5
Time taken for tests: 234.188507 seconds
Complete requests: 1000
Failed requests: 996
(Connect: 0, Length: 996, Exceptions: 0)
Write errors: 0
Total transferred: 47648329 bytes
HTML transferred: 46797329 bytes
Requests per second: 4.27 [#/sec] (mean)
Time per request: 1170.943 [ms] (mean)
Time per request: 234.189 [ms] (mean, across all concurrent requests)
Transfer rate: 198.69 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 132 143 95.8 134 3138
Processing: 854 1019 273.3 927 2726
Waiting: 417 484 49.0 476 1087
Total: 991 1162 296.1 1062 4235

Percentage of the requests served within a certain time (ms)
50% 1062
66% 1088
75% 1119
80% 1163
90% 1381
95% 1858
98% 2231
99% 2571
100% 4235 (longest request)

Y a pleins d’infos sympas, non? :slightly_smiling:

.

waaaaaaaaah

C’est pas du tout mon objectif :slightly_smiling: :slightly_smiling:

Au fait, l’a l’air sympa comme tout, ton site :slightly_smiling:

.

[quote=“tellmewhy”]Bonsoir sonador, :slightly_smiling:

Bah, je sais bien, c’est une plaisanterie, de toutes façons au pire,
je mettrais une cagoule. :smt003 :smt003

Ce n’est pas mon site, c’est le site de cep, mais c’est vraiment excellent,
ce n’est pas compliqué, c’est une mine d’or. :wink: :mrgreen:[/quote]

Ah, tu me rassures. J’ai bien cru que tu en faisais des cauchemars, moi!

Allez, je continue de fouiner. J’ai trouvé d’autres trucs sympa, faut que je teste :slightly_smiling: