-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlinux_processus_interactive.html
More file actions
735 lines (660 loc) · 45.9 KB
/
Copy pathlinux_processus_interactive.html
File metadata and controls
735 lines (660 loc) · 45.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Gestion des processus Linux — Guide interactif</title>
<style>
:root{--bg:#f8fafc;--card:#fff;--border:#e2e8f0;--text:#1e293b;--muted:#64748b;--acc:#ca8a04;--acc2:#a16207;--blue600:#2563eb;--green:#16a34a;--red:#dc2626;--orange:#ea580c;--purple:#7c3aed;--grad1:#1a1300;--grad2:#332600}
@media(prefers-color-scheme:dark){:root{--bg:#0d0d0d;--card:#1a1a1a;--border:#2a2a2a;--text:#e2e8f0;--muted:#94a3b8}}
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:'Segoe UI',system-ui,sans-serif;background:var(--bg);color:var(--text);line-height:1.6}
header{background:linear-gradient(135deg,var(--grad1),var(--grad2));padding:2rem 1rem;text-align:center;border-bottom:2px solid var(--acc)}
header h1{font-size:2rem;font-weight:800;color:#fff}
header p{color:#fde68a;margin-top:.4rem;font-size:.95rem}
nav{position:sticky;top:0;z-index:100;background:var(--card);border-bottom:1px solid var(--border);padding:.5rem 1rem;display:flex;gap:.5rem;flex-wrap:wrap;justify-content:center}
.tab-btn{padding:.4rem 1rem;border:none;border-radius:999px;cursor:pointer;font-size:.85rem;font-weight:600;background:var(--border);color:var(--muted);transition:all .2s}
.tab-btn.active{background:var(--blue600);color:#fff}
.tab-btn:hover:not(.active){background:var(--acc);color:#fff}
section{display:none;max-width:1100px;margin:0 auto;padding:1.5rem 1rem}
section.active{display:block}
h2{font-size:1.4rem;font-weight:700;margin-bottom:1rem;color:var(--acc)}
h3{font-size:1.1rem;font-weight:600;margin:1.2rem 0 .6rem}
.grid{display:grid;gap:1rem}.g2{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}.g3{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}
.card{background:var(--card);border:1px solid var(--border);border-radius:.75rem;padding:1.2rem}
.card h4{font-size:1rem;font-weight:700;margin-bottom:.5rem;color:var(--acc)}
.codeblk{background:#1e1e2e;color:#cdd6f4;border-radius:.5rem;padding:1rem;font-family:'Cascadia Code','Fira Code',monospace;font-size:.82rem;overflow-x:auto;margin:.5rem 0;line-height:1.7;white-space:pre-wrap}
.c-kw{color:#89b4fa}.c-str{color:#a6e3a1}.c-comment{color:#6c7086;font-style:italic}.c-val{color:#f9e2af}.c-fn{color:#cba6f7}.c-root{color:#f38ba8;font-weight:700}
table{width:100%;border-collapse:collapse;font-size:.85rem;margin:.5rem 0}
th{background:var(--acc);color:#fff;padding:.5rem .75rem;text-align:left}
td{padding:.4rem .65rem;border-bottom:1px solid var(--border)}
tr:hover td{background:var(--border)}
.info-box{background:var(--card);border-left:4px solid var(--acc);border-radius:.5rem;padding:.8rem 1rem;margin:.5rem 0}
.info-box.green{border-color:var(--green)}.info-box.red{border-color:var(--red)}.info-box.blue{border-color:var(--blue600)}.info-box.orange{border-color:var(--orange)}.info-box.purple{border-color:var(--purple)}
.badge{display:inline-block;padding:.15rem .55rem;border-radius:999px;font-size:.72rem;font-weight:700;margin-left:.3rem}
.badge-user{background:#dcfce7;color:#15803d}
.badge-root{background:#fee2e2;color:#b91c1c}
@media(prefers-color-scheme:dark){.badge-user{background:#14532d;color:#86efac}.badge-root{background:#450a0a;color:#fca5a5}}
.cmd{background:var(--card);border:1px solid var(--border);border-left:4px solid var(--acc);border-radius:.5rem;padding:.7rem .9rem;margin:.5rem 0}
.cmd .name{font-family:'Cascadia Code',monospace;font-weight:700;color:var(--acc);font-size:.95rem}
.cmd .desc{font-size:.85rem;margin-top:.2rem}
.state-row{display:grid;grid-template-columns:60px 1fr 1fr;gap:.5rem;padding:.5rem;background:var(--card);border-radius:.4rem;border-left:4px solid var(--acc);margin:.3rem 0;font-size:.85rem;align-items:center}
.state-row .lt{font-weight:900;font-size:1.4rem;color:var(--acc);text-align:center}
.signal{padding:.5rem .8rem;border-left:3px solid var(--acc);background:var(--card);border-radius:.4rem;margin:.3rem 0;font-size:.85rem}
.signal .num{font-family:monospace;font-weight:700;color:var(--acc);margin-right:.5rem}
.quiz-q{background:var(--card);border:1px solid var(--border);border-radius:.75rem;padding:1.2rem;margin:.8rem 0}
.quiz-q p{font-weight:600;margin-bottom:.7rem}
.quiz-opt{padding:.5rem .8rem;border:1px solid var(--border);border-radius:.4rem;margin:.3rem 0;cursor:pointer;transition:all .2s}
.quiz-opt:hover{border-color:var(--acc);background:rgba(202,138,4,.05)}
.quiz-opt.correct{background:#dcfce7;border-color:var(--green);color:#166534}
.quiz-opt.wrong{background:#fee2e2;border-color:var(--red);color:#991b1b}
@media(prefers-color-scheme:dark){.quiz-opt.correct{background:#14532d;color:#86efac}.quiz-opt.wrong{background:#450a0a;color:#fca5a5}}
#quiz-score{display:none;text-align:center;padding:1.5rem;background:var(--card);border-radius:.75rem;margin-top:1rem;font-size:1.1rem;font-weight:700}
</style>
</head>
<body>
<header>
<h1>Gestion des processus — Linux</h1>
<p>Cycle de vie, signaux, scheduler, systemd, commandes user vs root</p>
</header>
<nav>
<button class="tab-btn active" onclick="showTab('overview')">Vue d'ensemble</button>
<button class="tab-btn" onclick="showTab('lifecycle')">Cycle de vie & états</button>
<button class="tab-btn" onclick="showTab('user')">Commandes utilisateur</button>
<button class="tab-btn" onclick="showTab('admin')">Commandes admin (root)</button>
<button class="tab-btn" onclick="showTab('signals')">Signaux</button>
<button class="tab-btn" onclick="showTab('scheduling')">Priorités & scheduler</button>
<button class="tab-btn" onclick="showTab('systemd')">systemd & services</button>
<button class="tab-btn" onclick="showTab('advanced')">cgroups & namespaces</button>
<button class="tab-btn" onclick="showTab('quiz')">Quiz</button>
</nav>
<section id="overview" class="active">
<h2>Vue d'ensemble</h2>
<div class="grid g2">
<div class="card">
<h4>Qu'est-ce qu'un processus ?</h4>
<p style="font-size:.88rem;margin-bottom:.5rem">Un <strong>processus</strong> est une instance d'un programme en cours d'exécution. Chaque processus a :</p>
<ul style="font-size:.85rem;padding-left:1.2rem;line-height:1.8">
<li><strong>PID</strong> (Process ID) unique</li>
<li><strong>PPID</strong> (Parent PID)</li>
<li><strong>UID/GID</strong> (utilisateur/groupe propriétaire)</li>
<li>Espace d'<strong>adressage mémoire</strong> virtuel isolé</li>
<li><strong>Threads</strong> (un ou plusieurs, partageant la mémoire)</li>
<li><strong>File descriptors</strong> (stdin, stdout, stderr + autres)</li>
<li><strong>Variables d'environnement</strong></li>
<li><strong>Working directory</strong></li>
<li>État (R, S, D, T, Z, I)</li>
</ul>
</div>
<div class="card">
<h4>Hiérarchie des processus</h4>
<p style="font-size:.88rem;margin-bottom:.5rem">Tous les processus descendent de <strong>PID 1</strong> (init / systemd / launchd) ou <strong>PID 2</strong> (kthreadd pour les kernel threads).</p>
<div class="codeblk">$ pstree -p
systemd(<span class="c-val">1</span>)─┬─NetworkManager(<span class="c-val">812</span>)
├─sshd(<span class="c-val">1024</span>)───sshd(<span class="c-val">2350</span>)───bash(<span class="c-val">2351</span>)
├─cron(<span class="c-val">890</span>)
└─dbus-daemon(<span class="c-val">756</span>)</div>
<div class="info-box blue" style="margin-top:.4rem;font-size:.82rem">
Si un processus parent meurt avant ses enfants, ceux-ci sont <strong>"réparentés" sur PID 1</strong> (orphan reaping).
</div>
</div>
</div>
<div class="card" style="margin-top:1rem">
<h4>Pseudo-filesystem /proc</h4>
<p style="font-size:.88rem;margin-bottom:.5rem">Chaque processus a un répertoire <code>/proc/<PID>/</code> qui expose ses attributs.</p>
<table>
<tr><th>Fichier</th><th>Contenu</th></tr>
<tr><td>/proc/<pid>/status</td><td>Infos lisibles (Uid, Pid, État, Threads, RSS…)</td></tr>
<tr><td>/proc/<pid>/stat</td><td>Stats brutes (utilisées par ps/top)</td></tr>
<tr><td>/proc/<pid>/cmdline</td><td>Ligne de commande complète (séparateur \0)</td></tr>
<tr><td>/proc/<pid>/cwd</td><td>Lien symbolique vers le working dir</td></tr>
<tr><td>/proc/<pid>/exe</td><td>Lien vers le binaire</td></tr>
<tr><td>/proc/<pid>/fd/</td><td>Fichiers ouverts (file descriptors)</td></tr>
<tr><td>/proc/<pid>/environ</td><td>Variables d'environnement</td></tr>
<tr><td>/proc/<pid>/maps</td><td>Mappings mémoire (libs, heap, stack)</td></tr>
<tr><td>/proc/<pid>/limits</td><td>ulimits actifs</td></tr>
<tr><td>/proc/<pid>/oom_score</td><td>Score utilisé par OOM killer</td></tr>
</table>
<div class="info-box red" style="margin-top:.4rem;font-size:.82rem">
Lire <code>/proc/<pid>/environ</code> ou <code>/proc/<pid>/fd/</code> des autres utilisateurs nécessite <strong>root</strong> <span class="badge badge-root">root</span>.
</div>
</div>
</section>
<section id="lifecycle">
<h2>Cycle de vie & états</h2>
<div class="card">
<h4>Création : fork() + exec()</h4>
<div class="codeblk"><span class="c-comment">// Modèle Unix historique</span>
<span class="c-kw">pid_t</span> pid = <span class="c-fn">fork</span>(); <span class="c-comment">// duplique le processus</span>
<span class="c-kw">if</span> (pid == <span class="c-val">0</span>) { <span class="c-comment">// enfant</span>
<span class="c-fn">execve</span>(<span class="c-str">"/bin/ls"</span>, args, env); <span class="c-comment">// remplace par un autre binaire</span>
} <span class="c-kw">else</span> { <span class="c-comment">// parent</span>
<span class="c-fn">waitpid</span>(pid, &status, <span class="c-val">0</span>); <span class="c-comment">// attend l'enfant</span>
}</div>
<div class="info-box green" style="margin-top:.4rem;font-size:.82rem">
<strong>Copy-on-Write :</strong> fork() ne duplique pas vraiment la mémoire — les pages sont partagées en lecture seule jusqu'à modification.
</div>
</div>
<h3 style="margin-top:1rem">États d'un processus</h3>
<p style="color:var(--muted);font-size:.85rem">Visibles dans la colonne <code>STAT</code> ou <code>S</code> de <code>ps</code>/<code>top</code></p>
<div class="state-row" style="border-left-color:var(--green)"><div class="lt">R</div><div><strong>Running / Runnable</strong></div><div>En exécution ou prêt à l'être (run-queue)</div></div>
<div class="state-row" style="border-left-color:var(--blue600)"><div class="lt">S</div><div><strong>Sleeping (interruptible)</strong></div><div>Attend un événement (I/O, signal, sleep). Le plus courant.</div></div>
<div class="state-row" style="border-left-color:var(--red)"><div class="lt">D</div><div><strong>Uninterruptible sleep</strong></div><div>Attend une I/O bloquante (disque, NFS). Ne peut pas être tué !</div></div>
<div class="state-row" style="border-left-color:var(--orange)"><div class="lt">T</div><div><strong>Stopped</strong></div><div>Arrêté par SIGSTOP/SIGTSTP (Ctrl+Z) ou ptrace</div></div>
<div class="state-row" style="border-left-color:var(--purple)"><div class="lt">Z</div><div><strong>Zombie</strong></div><div>Terminé, attend que son parent lise son code de retour via wait()</div></div>
<div class="state-row" style="border-left-color:var(--muted)"><div class="lt">I</div><div><strong>Idle</strong></div><div>Kernel thread inactif (depuis 4.14)</div></div>
<div class="grid g2" style="margin-top:1rem">
<div class="card">
<h4>Caractères additionnels (STAT)</h4>
<table>
<tr><th>Symbole</th><th>Sens</th></tr>
<tr><td><</td><td>Haute priorité (nice négatif)</td></tr>
<tr><td>N</td><td>Faible priorité (nice positif)</td></tr>
<tr><td>L</td><td>Pages verrouillées en RAM (mlock)</td></tr>
<tr><td>s</td><td>Leader de session</td></tr>
<tr><td>l</td><td>Multi-threadé</td></tr>
<tr><td>+</td><td>Au foreground du terminal</td></tr>
</table>
</div>
<div class="card">
<h4>Zombies — pourquoi et comment ?</h4>
<div class="info-box orange">
Un <strong>zombie</strong> est un processus terminé dont le parent n'a pas lu le code de retour via <code>wait()</code>. Il ne consomme aucune CPU ni mémoire — juste une entrée dans la table des processus.
</div>
<div class="codeblk" style="margin-top:.4rem"><span class="c-comment"># Trouver les zombies</span>
ps aux | <span class="c-fn">awk</span> <span class="c-str">'$8=="Z"'</span>
<span class="c-comment"># Pour les supprimer : tuer le parent (qui leur ré-attribue PID 1)</span>
ps -o ppid= -p <zombie_pid> <span class="c-comment"># trouver le parent</span>
kill -CHLD <ppid> <span class="c-comment"># lui signaler de récolter</span></div>
</div>
</div>
</section>
<section id="user">
<h2>Commandes utilisateur (sans privilège) <span class="badge badge-user">user</span></h2>
<p style="color:var(--muted);margin-bottom:1rem">Un utilisateur peut voir tous les processus mais n'agit que sur les siens, sauf root.</p>
<h3>Lister les processus</h3>
<div class="cmd">
<div class="name">ps</div>
<div class="desc">Snapshot des processus à l'instant t. Multiples conventions (BSD, Unix, GNU).</div>
<div class="codeblk"><span class="c-comment"># Top 3 syntaxes</span>
ps <span class="c-comment"># processus du terminal courant</span>
ps -ef <span class="c-comment"># tous, format Unix</span>
ps aux <span class="c-comment"># tous, format BSD (avec USER, %CPU, %MEM, STAT)</span>
ps -ejH <span class="c-comment"># arbre indenté</span>
ps -p <span class="c-val">1234</span> <span class="c-comment"># un PID précis</span>
ps -u alice <span class="c-comment"># d'un utilisateur</span>
ps -o pid,user,%cpu,%mem,cmd --sort=-%mem | head <span class="c-comment"># top mémoire</span></div>
</div>
<div class="cmd">
<div class="name">top / htop / btop</div>
<div class="desc">Vue temps réel interactive.</div>
<div class="codeblk">top <span class="c-comment"># standard</span>
top -p <span class="c-val">1234</span> <span class="c-comment"># surveiller un PID</span>
top -u alice <span class="c-comment"># d'un utilisateur</span>
htop <span class="c-comment"># moderne, couleurs, scroll, arbre (F5), search (F3)</span>
btop <span class="c-comment"># encore plus moderne, graphes</span>
<span class="c-comment"># Raccourcis top :</span>
<span class="c-comment"># k = kill, r = renice, M = sort %MEM, P = sort %CPU, c = full cmdline</span></div>
</div>
<div class="cmd">
<div class="name">pgrep / pidof</div>
<div class="desc">Trouver des PID par nom.</div>
<div class="codeblk">pgrep nginx <span class="c-comment"># PIDs des processus nginx</span>
pgrep -a nginx <span class="c-comment"># avec leur ligne de commande</span>
pgrep -u alice -l <span class="c-comment"># processus de alice avec nom</span>
pgrep -f <span class="c-str">"python.*serve"</span> <span class="c-comment"># match sur la cmdline complète</span>
pidof sshd <span class="c-comment"># équivalent simple</span></div>
</div>
<div class="cmd">
<div class="name">pstree</div>
<div class="desc">Vue arborescente des processus.</div>
<div class="codeblk">pstree <span class="c-comment"># arbre depuis init</span>
pstree -p <span class="c-comment"># avec PIDs</span>
pstree -u alice <span class="c-comment"># d'un utilisateur</span>
pstree -l <span class="c-val">1234</span> <span class="c-comment"># sous-arbre d'un PID</span></div>
</div>
<h3>Contrôler ses processus</h3>
<div class="cmd">
<div class="name">kill / killall</div>
<div class="desc">Envoyer un signal à <strong>vos</strong> processus.</div>
<div class="codeblk">kill <span class="c-val">1234</span> <span class="c-comment"># SIGTERM (15) — demande propre</span>
kill -<span class="c-val">9</span> <span class="c-val">1234</span> <span class="c-comment"># SIGKILL — brutal, dernier recours</span>
kill -HUP <span class="c-val">1234</span> <span class="c-comment"># SIGHUP — recharger config (souvent)</span>
killall nginx <span class="c-comment"># SIGTERM à tous les "nginx"</span>
killall -<span class="c-val">9</span> -u alice <span class="c-comment"># tous les processus de alice (vous-même)</span></div>
<div class="info-box red" style="margin-top:.4rem;font-size:.82rem">
Un utilisateur ne peut tuer <strong>que ses propres processus</strong>. Tenter sur un autre user → "Operation not permitted".
</div>
</div>
<div class="cmd">
<div class="name">nice / renice</div>
<div class="desc">Ajuster la priorité (niceness, -20 à +19).</div>
<div class="codeblk"><span class="c-comment"># Lancer avec une priorité réduite</span>
nice -n <span class="c-val">10</span> tar -czf bigfile.tar.gz /data
<span class="c-comment"># Modifier la priorité d'un PID existant</span>
renice -n <span class="c-val">15</span> -p <span class="c-val">1234</span>
<span class="c-comment"># ⚠️ Pour MONTER la priorité (nice négatif) : root requis</span>
renice -n -5 -p <span class="c-val">1234</span> <span class="c-comment"># Operation not permitted (sans sudo)</span></div>
</div>
<h3>Background, jobs, terminaux</h3>
<div class="cmd">
<div class="name">& / jobs / fg / bg</div>
<div class="desc">Gestion du shell interactif.</div>
<div class="codeblk">long-task & <span class="c-comment"># lancement en background</span>
jobs <span class="c-comment"># liste des jobs du shell</span>
fg %<span class="c-val">1</span> <span class="c-comment"># job 1 au foreground</span>
bg %<span class="c-val">1</span> <span class="c-comment"># reprend en background si stoppé</span>
Ctrl+Z <span class="c-comment"># stoppe (SIGTSTP)</span>
Ctrl+C <span class="c-comment"># interrompt (SIGINT)
</span>
disown %<span class="c-val">1</span> <span class="c-comment"># détache du shell (survit à logout)</span></div>
</div>
<div class="cmd">
<div class="name">nohup / screen / tmux</div>
<div class="desc">Survivre à la fermeture du terminal.</div>
<div class="codeblk">nohup long-script.sh & <span class="c-comment"># ignore SIGHUP, output dans nohup.out</span>
screen -S work <span class="c-comment"># session nommée</span>
<span class="c-comment"># Ctrl+A D pour détacher, screen -r work pour reprendre</span>
tmux new -s work <span class="c-comment"># tmux moderne, multi-fenêtres</span>
<span class="c-comment"># Ctrl+B D détache, tmux attach -t work pour reprendre</span></div>
</div>
<div class="cmd">
<div class="name">time</div>
<div class="desc">Mesurer le temps d'exécution.</div>
<div class="codeblk">time ./script.sh
<span class="c-comment"># real 0m1.234s (temps mur)</span>
<span class="c-comment"># user 0m0.567s (CPU userland)</span>
<span class="c-comment"># sys 0m0.123s (CPU kernel)</span>
/usr/bin/time -v ./script.sh <span class="c-comment"># détaillé (mémoire max, I/O)</span></div>
</div>
<div class="cmd">
<div class="name">lsof — votre vue</div>
<div class="desc">Lister les fichiers ouverts par <strong>vos</strong> processus.</div>
<div class="codeblk">lsof -p <span class="c-val">1234</span> <span class="c-comment"># fichiers ouverts par un PID</span>
lsof -u alice <span class="c-comment"># de votre utilisateur</span>
lsof | grep deleted <span class="c-comment"># fichiers supprimés mais encore ouverts</span></div>
<div class="info-box orange" style="margin-top:.4rem;font-size:.82rem">
Sans root, vous ne voyez que vos fichiers ouverts + ceux lisibles par tous. Pour la vue complète : <code>sudo lsof</code>.
</div>
</div>
</section>
<section id="admin">
<h2>Commandes admin (root) <span class="badge badge-root">root</span></h2>
<p style="color:var(--muted);margin-bottom:1rem">Avec <code>sudo</code> ou en tant que root, vous pouvez agir sur tous les processus du système.</p>
<h3>Tuer / agir sur les processus d'autres utilisateurs</h3>
<div class="cmd">
<div class="name">kill / pkill / killall (avec sudo)</div>
<div class="codeblk"><span class="c-root">sudo</span> kill -<span class="c-val">9</span> <span class="c-val">1234</span> <span class="c-comment"># tuer n'importe quel PID</span>
<span class="c-root">sudo</span> killall -u www-data <span class="c-comment"># tous les processus d'un user</span>
<span class="c-root">sudo</span> pkill -u alice <span class="c-comment"># équivalent (pkill = pgrep + kill)</span>
<span class="c-root">sudo</span> kill -<span class="c-val">9</span> -<span class="c-val">1</span> <span class="c-comment"># ⚠️ TOUS les processus (sauf PID 1)</span></div>
<div class="info-box red" style="margin-top:.4rem;font-size:.82rem">
<strong>kill -9 -1</strong> = signal envoyé à <strong>tous les processus du système</strong> (sauf init). C'est l'arme nucléaire — ne jamais utiliser en prod sans intention claire.
</div>
</div>
<h3>Inspecter en profondeur</h3>
<div class="cmd">
<div class="name">lsof complet</div>
<div class="codeblk"><span class="c-root">sudo</span> lsof <span class="c-comment"># TOUS les fichiers ouverts du système</span>
<span class="c-root">sudo</span> lsof -i :<span class="c-val">443</span> <span class="c-comment"># qui écoute sur le port 443 ?</span>
<span class="c-root">sudo</span> lsof -i TCP:<span class="c-val">22</span> <span class="c-comment"># SSH actuel</span>
<span class="c-root">sudo</span> lsof +D /var/log <span class="c-comment"># qui a ouvert un fichier dans ce dir</span>
<span class="c-root">sudo</span> lsof -p <span class="c-val">1234</span> <span class="c-comment"># fichiers d'un PID quelconque</span></div>
</div>
<div class="cmd">
<div class="name">strace / ltrace</div>
<div class="desc">Tracer les appels système (strace) ou de bibliothèque (ltrace) d'un processus.</div>
<div class="codeblk"><span class="c-root">sudo</span> strace -p <span class="c-val">1234</span> <span class="c-comment"># attacher à un PID existant</span>
strace -f ./monprog <span class="c-comment"># suivre les enfants (votre process)</span>
strace -e openat,read,write cmd <span class="c-comment"># filtrer par syscall</span>
strace -c ./script <span class="c-comment"># statistiques résumées</span>
ltrace -p <span class="c-val">1234</span> <span class="c-comment"># appels libC</span></div>
<div class="info-box red" style="margin-top:.4rem;font-size:.82rem">
Pour attacher strace à un processus d'un autre utilisateur : root requis. Ralentit le processus tracé jusqu'à 100×.
</div>
</div>
<div class="cmd">
<div class="name">/proc/<pid>/ — accès complet</div>
<div class="codeblk"><span class="c-root">sudo</span> cat /proc/<span class="c-val">1234</span>/environ | tr <span class="c-str">'\0'</span> <span class="c-str">'\n'</span>
<span class="c-comment"># Variables d'environnement (souvent contiennent des secrets!)</span>
<span class="c-root">sudo</span> ls -la /proc/<span class="c-val">1234</span>/fd/
<span class="c-comment"># File descriptors ouverts</span>
<span class="c-root">sudo</span> cat /proc/<span class="c-val">1234</span>/maps
<span class="c-comment"># Mappings mémoire (utilisé par gdb, debuggers)</span></div>
</div>
<h3>Forcer une priorité élevée</h3>
<div class="cmd">
<div class="name">renice / chrt avec privilège</div>
<div class="codeblk"><span class="c-root">sudo</span> renice -n -<span class="c-val">10</span> -p <span class="c-val">1234</span> <span class="c-comment"># priorité (nice -10, plus prioritaire)</span>
<span class="c-root">sudo</span> ionice -c <span class="c-val">1</span> -n <span class="c-val">0</span> -p <span class="c-val">1234</span> <span class="c-comment"># priorité I/O temps-réel</span>
<span class="c-comment"># Politique temps réel (root requis)</span>
<span class="c-root">sudo</span> chrt -f -p <span class="c-val">50</span> <span class="c-val">1234</span> <span class="c-comment"># SCHED_FIFO priority 50</span>
<span class="c-root">sudo</span> chrt -r -p <span class="c-val">99</span> <span class="c-val">1234</span> <span class="c-comment"># SCHED_RR priority 99</span></div>
</div>
<h3>OOM killer et limits</h3>
<div class="cmd">
<div class="name">Influencer l'OOM killer</div>
<div class="codeblk"><span class="c-comment"># Voir le score OOM d'un processus</span>
cat /proc/<span class="c-val">1234</span>/oom_score
cat /proc/<span class="c-val">1234</span>/oom_score_adj <span class="c-comment"># -1000 à +1000 (ajustement)</span>
<span class="c-comment"># Protéger un processus critique (kernel préfèrera tuer autre chose)</span>
<span class="c-root">sudo</span> echo -<span class="c-val">1000</span> > /proc/<span class="c-val">1234</span>/oom_score_adj
<span class="c-comment"># Voir les kills OOM dans les logs</span>
<span class="c-root">sudo</span> dmesg | grep -i <span class="c-str">"out of memory"</span>
<span class="c-root">sudo</span> journalctl -k | grep oom</div>
</div>
<div class="cmd">
<div class="name">prlimit (modifier les ulimits d'un PID)</div>
<div class="codeblk"><span class="c-root">sudo</span> prlimit --pid <span class="c-val">1234</span> <span class="c-comment"># voir tous les ulimits</span>
<span class="c-root">sudo</span> prlimit --pid <span class="c-val">1234</span> --nofile=<span class="c-val">65536</span>:<span class="c-val">65536</span> <span class="c-comment"># changer max files</span>
<span class="c-root">sudo</span> prlimit --pid <span class="c-val">1234</span> --as=<span class="c-val">4G</span> <span class="c-comment"># max virtuel memory</span></div>
</div>
<h3>Audit & sécurité</h3>
<div class="cmd">
<div class="name">auditd</div>
<div class="codeblk"><span class="c-root">sudo</span> auditctl -w /etc/passwd -p wa -k passwd_change
<span class="c-comment"># Surveille modifs sur /etc/passwd, tag "passwd_change"</span>
<span class="c-root">sudo</span> ausearch -k passwd_change | aureport
<span class="c-comment"># Voir qui a accédé</span>
<span class="c-comment"># Tracer les exec() de tous les processus</span>
<span class="c-root">sudo</span> auditctl -a exit,always -F arch=b64 -S execve</div>
</div>
</section>
<section id="signals">
<h2>Signaux</h2>
<p style="color:var(--muted);margin-bottom:1rem">Les signaux sont des notifications asynchrones envoyées à un processus.</p>
<div class="card">
<h4>Signaux principaux</h4>
<div class="signal"><span class="num">1 SIGHUP</span><strong>Hangup</strong> — déconnexion du terminal. Beaucoup de daemons l'utilisent pour <em>recharger leur config</em>.</div>
<div class="signal"><span class="num">2 SIGINT</span><strong>Interrupt</strong> — Ctrl+C dans un terminal.</div>
<div class="signal"><span class="num">3 SIGQUIT</span><strong>Quit</strong> — Ctrl+\ (génère un core dump).</div>
<div class="signal"><span class="num">9 SIGKILL</span><strong>Kill</strong> — termine immédiatement, <strong>impossible à intercepter</strong>. Le processus ne peut pas faire de cleanup. À éviter sauf dernier recours.</div>
<div class="signal"><span class="num">11 SIGSEGV</span><strong>Segmentation fault</strong> — accès mémoire invalide.</div>
<div class="signal"><span class="num">13 SIGPIPE</span><strong>Broken pipe</strong> — écrit sur un pipe sans lecteur.</div>
<div class="signal"><span class="num">15 SIGTERM</span><strong>Terminate</strong> — demande polie de terminer. Peut être interceptée → cleanup. <strong>Défaut de <code>kill</code></strong>.</div>
<div class="signal"><span class="num">17 SIGCHLD</span><strong>Child status changed</strong> — un enfant est mort, le parent doit faire wait().</div>
<div class="signal"><span class="num">18 SIGCONT</span><strong>Continue</strong> — reprend après un SIGSTOP.</div>
<div class="signal"><span class="num">19 SIGSTOP</span><strong>Stop</strong> — suspend l'exécution, <strong>impossible à intercepter</strong> (équivalent SIGKILL pour la suspension).</div>
<div class="signal"><span class="num">20 SIGTSTP</span><strong>Terminal stop</strong> — Ctrl+Z (interceptable, contrairement à SIGSTOP).</div>
<div class="signal"><span class="num">28 SIGWINCH</span><strong>Window changed</strong> — taille de fenêtre du terminal modifiée.</div>
<div class="signal"><span class="num">10/12 SIGUSR1/2</span><strong>User-defined</strong> — usage libre par l'application (souvent rotation de logs).</div>
</div>
<div class="grid g2" style="margin-top:1rem">
<div class="card">
<h4>Liste complète</h4>
<div class="codeblk">kill -l <span class="c-comment"># liste tous les signaux</span>
kill -l <span class="c-val">15</span> <span class="c-comment"># nom d'un signal</span>
man <span class="c-val">7</span> signal <span class="c-comment"># doc complète</span></div>
</div>
<div class="card">
<h4>Bonnes pratiques</h4>
<ul style="font-size:.85rem;padding-left:1.2rem;line-height:1.9">
<li><strong>SIGTERM d'abord</strong>, SIGKILL en dernier recours après timeout</li>
<li>Les daemons écoutent souvent <strong>SIGHUP</strong> pour reload de config (sans redémarrage)</li>
<li>SIGUSR1/2 utilisés pour la rotation de logs (nginx, postgres)</li>
<li>Si un processus est en <strong>état D</strong> (uninterruptible), même SIGKILL ne fait rien — il faut résoudre l'I/O bloquante d'abord</li>
</ul>
</div>
</div>
</section>
<section id="scheduling">
<h2>Priorités & scheduler</h2>
<div class="grid g2">
<div class="card">
<h4>Niceness (politique SCHED_OTHER / CFS)</h4>
<p style="font-size:.88rem;margin-bottom:.5rem">Échelle de <strong>-20 (très prioritaire)</strong> à <strong>+19 (très peu prioritaire)</strong>. 0 = défaut.</p>
<table>
<tr><th>Action</th><th>Droits</th></tr>
<tr><td>Augmenter le nice (rendre moins prioritaire)</td><td><span class="badge badge-user">user</span></td></tr>
<tr><td>Diminuer le nice (rendre plus prioritaire)</td><td><span class="badge badge-root">root</span> ou <code>CAP_SYS_NICE</code></td></tr>
</table>
<div class="codeblk" style="margin-top:.4rem">nice -n <span class="c-val">19</span> tar -cf big.tar /data <span class="c-comment"># très peu prio</span>
renice -n <span class="c-val">10</span> -p <span class="c-val">1234</span>
<span class="c-root">sudo</span> renice -n -<span class="c-val">10</span> -p <span class="c-val">1234</span> <span class="c-comment"># nécessite root</span></div>
</div>
<div class="card">
<h4>Politiques temps réel</h4>
<p style="font-size:.88rem;margin-bottom:.5rem">Pour les processus critiques en latence (audio, robotique, finance HFT).</p>
<table>
<tr><th>Politique</th><th>Description</th></tr>
<tr><td><strong>SCHED_OTHER (0)</strong></td><td>CFS — défaut, fair sharing</td></tr>
<tr><td><strong>SCHED_BATCH</strong></td><td>Optimisé batch (cache-friendly)</td></tr>
<tr><td><strong>SCHED_IDLE</strong></td><td>Très basse priorité (en arrière-plan total)</td></tr>
<tr><td><strong>SCHED_FIFO (1)</strong></td><td>Temps réel, FIFO, sans préemption autre que TR plus prio</td></tr>
<tr><td><strong>SCHED_RR (2)</strong></td><td>Round-robin temps réel</td></tr>
<tr><td><strong>SCHED_DEADLINE</strong></td><td>EDF (Earliest Deadline First), depuis 3.14</td></tr>
</table>
<div class="info-box red" style="margin-top:.4rem;font-size:.82rem">
<strong>Root requis</strong> pour les politiques RT (SCHED_FIFO/RR/DEADLINE) — un processus RT mal codé peut bloquer tout le système.
</div>
</div>
</div>
<div class="grid g2" style="margin-top:1rem">
<div class="card">
<h4>chrt & ionice</h4>
<div class="codeblk"><span class="c-comment"># Voir / modifier la politique d'ordonnancement</span>
chrt -p <span class="c-val">1234</span> <span class="c-comment"># affiche la politique actuelle</span>
<span class="c-root">sudo</span> chrt -f -p <span class="c-val">50</span> <span class="c-val">1234</span> <span class="c-comment"># SCHED_FIFO prio 50</span>
<span class="c-comment"># I/O priority</span>
ionice -p <span class="c-val">1234</span> <span class="c-comment"># voir</span>
ionice -c <span class="c-val">3</span> -p <span class="c-val">1234</span> <span class="c-comment"># idle I/O</span>
<span class="c-root">sudo</span> ionice -c <span class="c-val">1</span> -n <span class="c-val">0</span> -p <span class="c-val">1234</span> <span class="c-comment"># Real-Time I/O</span></div>
</div>
<div class="card">
<h4>Affinité CPU</h4>
<div class="codeblk"><span class="c-comment"># Voir sur quels CPU un process tourne</span>
taskset -cp <span class="c-val">1234</span>
<span class="c-comment"># Restreindre à certains CPU</span>
taskset -cp <span class="c-val">0,2</span> <span class="c-val">1234</span> <span class="c-comment"># CPU 0 et 2 seulement</span>
<span class="c-comment"># Démarrer avec affinité</span>
taskset -c <span class="c-val">0-3</span> ./mon_programme
<span class="c-comment"># Voir l'usage CPU par cœur</span>
mpstat -P ALL <span class="c-val">1</span>
htop <span class="c-comment"># puis F2 → Display options → Detailed CPU</span></div>
</div>
</div>
</section>
<section id="systemd">
<h2>systemd & services</h2>
<p style="color:var(--muted);margin-bottom:1rem"><strong>systemd</strong> (PID 1 sur la plupart des distros modernes) gère les services, sockets, timers, mounts…</p>
<div class="grid g2">
<div class="card">
<h4>Gérer les services <span class="badge badge-user">user</span> + <span class="badge badge-root">root</span></h4>
<div class="codeblk"><span class="c-comment"># Lecture (sans root)</span>
systemctl status nginx
systemctl is-active sshd
systemctl is-enabled cron
systemctl list-units --type=service
systemctl list-unit-files
systemctl cat nginx <span class="c-comment"># voir le fichier unit</span>
<span class="c-comment"># Action (root)</span>
<span class="c-root">sudo</span> systemctl start nginx
<span class="c-root">sudo</span> systemctl stop nginx
<span class="c-root">sudo</span> systemctl restart nginx
<span class="c-root">sudo</span> systemctl reload nginx <span class="c-comment"># reload sans restart</span>
<span class="c-root">sudo</span> systemctl enable nginx <span class="c-comment"># démarrage auto au boot</span>
<span class="c-root">sudo</span> systemctl disable nginx
<span class="c-root">sudo</span> systemctl mask nginx <span class="c-comment"># empêche tout démarrage</span></div>
</div>
<div class="card">
<h4>Logs avec journalctl</h4>
<div class="codeblk"><span class="c-comment"># Visible par tous (souvent), mais détails sensibles → root</span>
journalctl <span class="c-comment"># tous les logs</span>
journalctl -u nginx <span class="c-comment"># d'un service</span>
journalctl -u nginx -f <span class="c-comment"># follow (tail -f)</span>
journalctl --since <span class="c-str">"1 hour ago"</span>
journalctl --since today --until <span class="c-str">"1 hour ago"</span>
journalctl -p err -b <span class="c-comment"># erreurs depuis le boot</span>
journalctl -k <span class="c-comment"># kernel (dmesg)</span>
journalctl _UID=<span class="c-val">1000</span> <span class="c-comment"># logs d'un user (root requis pour autres)</span></div>
</div>
</div>
<div class="card" style="margin-top:1rem">
<h4>Créer un service utilisateur (sans root) <span class="badge badge-user">user</span></h4>
<div class="codeblk"><span class="c-comment"># ~/.config/systemd/user/myapp.service</span>
[Unit]
Description=Mon application
[Service]
ExecStart=/home/alice/bin/myapp
Restart=on-failure
[Install]
WantedBy=default.target</div>
<div class="codeblk" style="margin-top:.4rem">systemctl --user daemon-reload
systemctl --user enable myapp
systemctl --user start myapp
systemctl --user status myapp
<span class="c-comment"># Pour qu'il survive à la déconnexion (lingering)</span>
<span class="c-root">sudo</span> loginctl enable-linger alice</div>
</div>
<div class="card" style="margin-top:1rem">
<h4>Créer un service système <span class="badge badge-root">root</span></h4>
<div class="codeblk"><span class="c-comment"># /etc/systemd/system/myapp.service</span>
[Unit]
Description=Mon application
After=network.target
Requires=postgresql.service
[Service]
Type=simple
User=appuser
Group=appgroup
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/myapp
Restart=always
RestartSec=<span class="c-val">5</span>
StandardOutput=journal
StandardError=journal
<span class="c-comment"># Hardening</span>
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
LimitNOFILE=<span class="c-val">65536</span>
[Install]
WantedBy=multi-user.target</div>
<div class="codeblk" style="margin-top:.4rem"><span class="c-root">sudo</span> systemctl daemon-reload
<span class="c-root">sudo</span> systemctl enable --now myapp</div>
</div>
<div class="grid g2" style="margin-top:1rem">
<div class="card">
<h4>Timers (alternative à cron)</h4>
<div class="codeblk"><span class="c-comment"># /etc/systemd/system/backup.timer</span>
[Unit]
Description=Backup quotidien
[Timer]
OnCalendar=daily
Persistent=true <span class="c-comment"># rattrape si éteint</span>
[Install]
WantedBy=timers.target
<span class="c-comment"># Lister les timers actifs</span>
systemctl list-timers
systemctl list-timers --all</div>
</div>
<div class="card">
<h4>Analyse de boot</h4>
<div class="codeblk">systemd-analyze <span class="c-comment"># temps de boot</span>
systemd-analyze blame <span class="c-comment"># services les plus lents</span>
systemd-analyze critical-chain
systemd-analyze plot > boot.svg <span class="c-comment"># SVG graphique</span>
<span class="c-comment"># Voir les dépendances</span>
systemctl list-dependencies multi-user.target</div>
</div>
</div>
</section>
<section id="advanced">
<h2>cgroups & namespaces (avancé)</h2>
<div class="grid g2">
<div class="card">
<h4>cgroups v2</h4>
<p style="font-size:.88rem;margin-bottom:.5rem">Limite et compte les ressources (CPU, mémoire, I/O, network) d'un groupe de processus. Base des conteneurs.</p>
<div class="codeblk"><span class="c-comment"># Voir la hiérarchie</span>
ls /sys/fs/cgroup/
<span class="c-comment"># systemd crée un cgroup par service</span>
systemd-cgls <span class="c-comment"># arbre des cgroups</span>
systemd-cgtop <span class="c-comment"># top par cgroup</span>
<span class="c-comment"># Voir le cgroup d'un PID</span>
cat /proc/<span class="c-val">1234</span>/cgroup
<span class="c-comment"># Limiter via systemd (root)</span>
<span class="c-root">sudo</span> systemctl set-property nginx.service \
CPUQuota=<span class="c-val">50%</span> MemoryMax=<span class="c-val">1G</span> IOWeight=<span class="c-val">100</span></div>
</div>
<div class="card">
<h4>Namespaces — isolation</h4>
<p style="font-size:.88rem;margin-bottom:.5rem">Isole certains aspects du système. Base des containers (Docker, podman).</p>
<table>
<tr><th>Namespace</th><th>Isole</th></tr>
<tr><td>pid</td><td>Arbre des PIDs (PID 1 dans le NS)</td></tr>
<tr><td>net</td><td>Interfaces, routes, ports</td></tr>
<tr><td>mnt</td><td>Points de montage</td></tr>
<tr><td>uts</td><td>Hostname, domain</td></tr>
<tr><td>ipc</td><td>Sémaphores SysV, shared memory</td></tr>
<tr><td>user</td><td>UID/GID mapping (containers rootless)</td></tr>
<tr><td>cgroup</td><td>Vue cgroups</td></tr>
<tr><td>time</td><td>Horloge système (depuis 5.6)</td></tr>
</table>
<div class="codeblk" style="margin-top:.4rem"><span class="c-comment"># Lancer un shell dans un nouveau namespace</span>
<span class="c-root">sudo</span> unshare --fork --pid --mount-proc bash
<span class="c-comment"># dans le shell : ps aux → seul bash visible</span></div>
</div>
</div>
<div class="grid g2" style="margin-top:1rem">
<div class="card">
<h4>Capabilities</h4>
<p style="font-size:.88rem;margin-bottom:.5rem">Découpe les privilèges root en ~40 capabilities granulaires.</p>
<div class="codeblk">getcap /usr/bin/ping <span class="c-comment"># quelles caps</span>
<span class="c-root">sudo</span> setcap cap_net_raw+ep /usr/bin/ping
<span class="c-comment"># Exemples de capabilities</span>
<span class="c-comment"># CAP_NET_BIND_SERVICE bind ports < 1024 sans root</span>
<span class="c-comment"># CAP_SYS_ADMIN mount, etc.</span>
<span class="c-comment"># CAP_SYS_PTRACE ptrace autres process</span>
<span class="c-comment"># CAP_NET_ADMIN config réseau</span>
<span class="c-comment"># CAP_DAC_OVERRIDE contourner permissions FS</span>
<span class="c-comment"># Voir les caps d'un process</span>
getpcaps <span class="c-val">1234</span>
cat /proc/<span class="c-val">1234</span>/status | grep Cap</div>
</div>
<div class="card">
<h4>eBPF — observabilité moderne</h4>
<p style="font-size:.88rem;margin-bottom:.5rem">Permet de tracer le kernel sans recompilation. Outils basés eBPF :</p>
<ul style="font-size:.85rem;padding-left:1.2rem;line-height:1.7">
<li><code>bpftrace</code> : DSL haut niveau</li>
<li><code>bcc-tools</code> (execsnoop, opensnoop, tcpconnect, biotop…)</li>
<li><code>perf</code> : profiling</li>
<li><code>cilium</code> : networking / security</li>
</ul>
<div class="codeblk" style="margin-top:.4rem"><span class="c-root">sudo</span> execsnoop-bpfcc
<span class="c-comment"># Affiche chaque exec() en temps réel sur tout le système</span>
<span class="c-root">sudo</span> bpftrace -e <span class="c-str">'tracepoint:syscalls:sys_enter_execve { printf("%s %s\n", comm, str(args->filename)); }'</span></div>
</div>
</div>
</section>
<section id="quiz">
<h2>Quiz — Linux processus</h2>
<div id="quiz-container"></div>
<div id="quiz-score"></div>
</section>
<script>
function showTab(id){document.querySelectorAll('section').forEach(s=>s.classList.remove('active'));document.querySelectorAll('.tab-btn').forEach(b=>b.classList.remove('active'));document.getElementById(id).classList.add('active');event.target.classList.add('active')}
const quizData=[
{q:"Quel processus a toujours le PID 1 ?",opts:["bash","init / systemd / launchd","kthreadd","kernel"],a:1},
{q:"Que signifie l'état D dans ps ?",opts:["Dead","Disk wait — uninterruptible sleep","Done","Debug"],a:1},
{q:"Comment envoyer SIGTERM à un processus ?",opts:["kill -9","kill -15 (ou simplement kill)","kill -1","stop"],a:1},
{q:"Quel signal ne peut JAMAIS être intercepté ni ignoré ?",opts:["SIGTERM","SIGHUP","SIGKILL et SIGSTOP","SIGINT"],a:2},
{q:"Qui peut diminuer le nice d'un processus (le rendre plus prioritaire) ?",opts:["Tout utilisateur","Le propriétaire","Root uniquement (ou CAP_SYS_NICE)","Personne"],a:2},
{q:"Qu'est-ce qu'un zombie ?",opts:["Un processus malveillant","Un processus terminé dont le parent n'a pas lu le code retour","Un processus consommant 100% CPU","Un kernel thread"],a:1},
{q:"Quel fichier /proc contient les fichiers ouverts d'un PID ?",opts:["/proc/PID/status","/proc/PID/fd/","/proc/PID/cmdline","/proc/PID/maps"],a:1},
{q:"Quelle commande affiche les processus en arbre ?",opts:["ps -ef","top","pstree","ls"],a:2},
{q:"Pour qu'un service utilisateur survive à la déconnexion, il faut...",opts:["Rien à faire","Activer le lingering : sudo loginctl enable-linger user","Le mettre en root","Utiliser nohup"],a:1},
{q:"Quelle commande recharge la config d'un daemon en envoyant SIGHUP ?",opts:["kill -HUP <pid>","kill -9 <pid>","reset","reload"],a:0},
{q:"À quoi sert systemctl mask service ?",opts:["Cacher le service","Empêcher toute possibilité de le démarrer (même comme dépendance)","Le mettre en pause","Le supprimer"],a:1},
{q:"Qu'est-ce qu'un cgroup ?",opts:["Un groupe d'utilisateurs","Un mécanisme kernel pour limiter et compter les ressources d'un groupe de processus","Un namespace","Un signal"],a:1},
{q:"Comment voir le cgroup d'un PID ?",opts:["ps -ef","cat /proc/<pid>/cgroup","systemctl status","top"],a:1},
{q:"Qui peut attacher strace à un processus d'un autre utilisateur ?",opts:["Tout le monde","Root (ou avec CAP_SYS_PTRACE)","Personne","Le parent"],a:1},
{q:"Quelle politique d'ordonnancement est la défaut en Linux ?",opts:["SCHED_FIFO","SCHED_OTHER / CFS","SCHED_DEADLINE","SCHED_RR"],a:1}
];
let answers=new Array(quizData.length).fill(null);
function buildQuiz(){const c=document.getElementById('quiz-container');c.innerHTML=quizData.map((q,i)=>`<div class="quiz-q"><p>${i+1}. ${q.q}</p>${q.opts.map((o,j)=>`<div class="quiz-opt" onclick="answer(this,${i},${j})">${o}</div>`).join('')}</div>`).join('')}
function answer(el,qi,oi){const parent=el.parentElement;if(parent.querySelector('.correct,.wrong'))return;answers[qi]=oi;const correct=quizData[qi].a;parent.querySelectorAll('.quiz-opt').forEach((o,j)=>{if(j===correct)o.classList.add('correct');else if(j===oi&&oi!==correct)o.classList.add('wrong')});if(answers.every(a=>a!==null)){const score=answers.filter((a,i)=>a===quizData[i].a).length;const sc=document.getElementById('quiz-score');sc.style.display='block';sc.innerHTML=`Score : ${score}/${quizData.length} ${score>=12?'Excellent !':score>=8?'Bien !':'À revoir'}`}}
buildQuiz();
</script>
</body>
</html>