ЁЯПл The SchoolтА║ЁЯз╣ Shell scriptingтА║ЁЯСе рдзрдбрд╛ 09 тАФ Processes рдЖрдгрд┐ jobs: рдЗрдорд╛рд░рддреАрдд рдХреЛрдг рдЖрд╣реЗ
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯСе рдзрдбрд╛ 09 тАФ Processes рдЖрдгрд┐ jobs: рдЗрдорд╛рд░рддреАрдд рдХреЛрдг рдЖрд╣реЗ

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 09 ┬╖ рдкреБрдвреЗ: lesson-10-scheduling


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбреЗ 01тАУ09. Processes, signals, background jobs, рд╡рд╛рдЯ рдкрд╛рд╣рдгреЗ рдЖрдгрд┐ parallelism тАФ рдЖрдгрд┐ container рдЪреНрдпрд╛ PID 1 рдиреЗ рдХрд░рд╛рдпрд▓рд╛рдЪ рд╣рд╡реНрдпрд╛рдд рдЕрд╢рд╛ рджреЛрди рдЧреЛрд╖реНрдЯреА.

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рдкреНрд░рддреНрдпреЗрдХ рдЪрд╛рд▓реВ program рдореНрд╣рдгрдЬреЗ рдЗрдорд╛рд░рддреАрддрд▓реА рдПрдХ рд╡реНрдпрдХреНрддреА, рдЬрд┐рдЪреНрдпрд╛рдХрдбреЗ badge рдХреНрд░рдорд╛рдВрдХ (PID) рдЖрдгрд┐ рдПрдХ boss (parent) рдЕрд╕рддреЛ. ps рдореНрд╣рдгрдЬреЗ рдкрд╛рд╣реБрдгреНрдпрд╛рдВрдЪреА рд╡рд╣реА. рдПрдЦрд╛рджреНрдпрд╛рд▓рд╛ рдмрд╛рд╣реЗрд░ рдЬрд╛рдпрд▓рд╛ рд╕рд╛рдВрдЧрд╛рдпрдЪреЗ рдЕрд╕реЗрд▓ рддрд░ рддреБрдореНрд╣реА рдзреНрд╡рдирд┐рдХреНрд╖реЗрдкрдХ рд╡рд╛рдкрд░рддрд╛ тАФ рдПрдХ signal: TERM рдореНрд╣рдгрдЬреЗ "рдХреГрдкрдпрд╛ рдХрд╛рдо рдЖрд╡рд░рд╛", KILL рдореНрд╣рдгрдЬреЗ "рдмрд╛рд╣реЗрд░, рдЖрддреНрддрд╛рдЪ", INT рдореНрд╣рдгрдЬреЗ Ctrl-C, HUP рдореНрд╣рдгрдЬреЗ "рддреБрдордЪреНрдпрд╛ рдиреЛрдВрджреА рдкреБрдиреНрд╣рд╛ рд╡рд╛рдЪрд╛". cmd & рдПрдЦрд╛рджреНрдпрд╛рд▓рд╛ background рдордзреНрдпреЗ рдХрд╛рдорд╛рд▓рд╛ рдкрд╛рдард╡рддреЛ; wait рддреЗ рдкрд░рдд рдпреЗрдИрдкрд░реНрдпрдВрдд рдерд╛рдВрдмрддреЛ; nohup рдореБрд│реЗ рддреБрдореНрд╣реА рдШрд░реА рдЧреЗрд▓реНрдпрд╛рд╡рд░рд╣реА рддреЗ рдХрд╛рдо рдХрд░рдд рд░рд╛рд╣рддрд╛рдд.

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart TD
  P1["PID 1 тАФ init / the entrypoint"] --> B["bash (your shell)"]
  B --> J1["backup.sh &  (job 1)"] --> T["tar"]
  B --> J2["sleep 30 &  (job 2)"]
  B -.->|"kill -TERM"| J2

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

Deploys рдЬреБрдиреЗ processes рдерд╛рдВрдмрд╡рддрд╛рдд рдЖрдгрд┐ рдирд╡реЗ рд╕реБрд░реВ рдХрд░рддрд╛рдд; timeouts рднрд░рдХрдЯрд▓реЗрд▓реЗ processes рдорд╛рд░рддрд╛рдд; CI steps parallel рдЪрд╛рд▓рд╡рддреЗ; PID 1 рдиреЗ TERM рдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖ рдХреЗрд▓реЗ рддрд░ containers рд╡рд╛рдИрдЯ рдкрджреНрдзрддреАрдиреЗ рдорд░рддрд╛рдд. рд╣реЗ рд╕рдЧрд│реЗ signal рдЖрдгрд┐ job рдЪреЗрдЪ рдкреНрд░рд╢реНрди рдЖрд╣реЗрдд.

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)

smoke test рдордзрд▓рд╛ L09: (sleep 0.2; echo "the bell rang") & wait. backup.sh рдЖрдкрд▓реЗ lock trap рдордзреНрдпреЗ рд╕реЛрдбрддреЗ, рдореНрд╣рдгреВрди run рдЪреНрдпрд╛ рдордзреЗрдЪ TERM рдЖрд▓рд╛ рддрд░реА directory рд╕реНрд╡рдЪреНрдЫ рд░рд╛рд╣рддреЗ.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

sleep 300 & echo "pid $!"; jobs; kill -TERM %1; wait %1 2>/dev/null; echo "gone"
(trap 'echo "TERM received, cleaning up"; exit 0' TERM; sleep 60) & p=$!; sleep 0.3; kill -TERM $p; wait $p
for f in bin/*.sh; do (bash -n "$f" && echo "$f ok") & done; wait               # syntax-check in parallel
printf '%s\n' 1 2 3 4 | xargs -P 4 -I{} sh -c 'sleep 0.{}; echo job {}'
timeout 1 sleep 5; echo "timeout exit: $?"                                       # 124
ps -o pid,ppid,comm -p $$

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

рдПрдХ PID, рдпрд╛рджреАрдд рдПрдХ job, gone; trap рдХреЗрд▓реЗрд▓рд╛ process TERM received рдЫрд╛рдкрддреЛ; рддреАрди ok рдУрд│реА; рдЬрд╡рд│рдЬрд╡рд│ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдорд╛рдиреЗ рдЪрд╛рд░ job N рдУрд│реА; timeout exit: 124; рддреБрдордЪрд╛ shell рдЖрдгрд┐ рддреНрдпрд╛рдЪрд╛ parent.

ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ

рддреБрдореНрд╣реА processes рд╕реБрд░реВ рдХрд░реВ рд╢рдХрддрд╛, рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╡рд░ рд▓рдХреНрд╖ рдареЗрд╡реВ рд╢рдХрддрд╛, рддреНрдпрд╛рдВрдирд╛ signal рдкрд╛рдард╡реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреА рд╡рд╛рдЯ рдкрд╛рд╣реВ рд╢рдХрддрд╛, рдХрд╛рдо parallel рдЪрд╛рд▓рд╡реВ рд╢рдХрддрд╛, рдЖрдгрд┐ KILL рдЖрдзреА TERM рд╣рд╛ рдирдореНрд░ (рдЖрдгрд┐ рдпреЛрдЧреНрдп) рдХреНрд░рдо рдХрд╛ рдЖрд╣реЗ рд╣реЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣реАрдд рдЖрд╣реЗ.

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: graceful shutdown, zero-downtime restarts, Kubernetes рдордзрд▓рд╛ 10 seconds рдЪрд╛ grace period тАФ рд╕рдЧрд│реЗ рдореНрд╣рдгрдЬреЗ "process TERM рд╣рд╛рддрд╛рд│рддреЛ рдХрд╛?". Docker рд╢рд╛рд│реЗрддрд▓рд╛ entrypoint рдЪрд╛ рдзрдбрд╛ рд╣рд╛рдЪ рдЖрд╣реЗ.

тПня╕П рдкреБрдвреЗ

рдзрдбрд╛ 10 тАФ scheduling рдЖрдгрд┐ automation: рдШрдВрдЯрд╛, рдЖрдгрд┐ рдПрдХрд╛рдЪ рд╡реЗрд│реА рдХрдзреАрдЪ рджреЛрдирджрд╛ рди рдЪрд╛рд▓рдгрд╛рд░рд╛ backup.

ЁЯСе Lesson 09 тАФ Processes & jobs: who is in the building

ЁЯУН You are here: Lesson 09 of 12 ┬╖ Next: lesson-10-scheduling


ЁЯУж What's in this branch

Lessons 01тАУ09. Processes, signals, background jobs, waiting and parallelism тАФ and the two things a container's PID 1 must do.

ЁЯзТ Explain like I'm 5

Every running program is a person in the building with a badge number (PID) and a boss (the parent). ps is the visitors' book. To ask someone to leave you use the tannoy тАФ a signal: TERM means "please finish up", KILL means "out, now", INT is Ctrl-C, HUP is "reload your notes". cmd & sends someone off to work in the background; wait waits for them to come back; nohup lets them keep working after you go home.

ЁЯЧ║я╕П Diagram

flowchart TD
  P1["PID 1 тАФ init / the entrypoint"] --> B["bash (your shell)"]
  B --> J1["backup.sh &  (job 1)"] --> T["tar"]
  B --> J2["sleep 30 &  (job 2)"]
  B -.->|"kill -TERM"| J2

тЭУ What

ЁЯдФ Why

Deploys stop old processes and start new ones; timeouts kill runaways; CI runs steps in parallel; containers die badly when PID 1 ignores TERM. All signal and job questions.

ЁЯФз How (in this repo)

The smoke test's L09: (sleep 0.2; echo "the bell rang") & wait. backup.sh releases its lock in a trap so a TERM mid-run still leaves the directory clean.

ЁЯзк Try it

sleep 300 & echo "pid $!"; jobs; kill -TERM %1; wait %1 2>/dev/null; echo "gone"
(trap 'echo "TERM received, cleaning up"; exit 0' TERM; sleep 60) & p=$!; sleep 0.3; kill -TERM $p; wait $p
for f in bin/*.sh; do (bash -n "$f" && echo "$f ok") & done; wait               # syntax-check in parallel
printf '%s\n' 1 2 3 4 | xargs -P 4 -I{} sh -c 'sleep 0.{}; echo job {}'
timeout 1 sleep 5; echo "timeout exit: $?"                                       # 124
ps -o pid,ppid,comm -p $$

тЬЕ Verify тАФ what you should see

A PID, one job listed, gone; the trapped process prints TERM received; three ok lines; four job N lines in near-random order; timeout exit: 124; your shell with its parent.

ЁЯПБ What you just proved

You can start, watch, signal and wait for processes, run work in parallel, and you know why TERM before KILL is the polite (and correct) order.

тЪая╕П Common mistakes

ЁЯПн Why this matters in production: graceful shutdown, zero-downtime restarts, the 10-second grace period in Kubernetes тАФ all "does the process handle TERM?". The Docker school's entrypoint lesson is this one.

тПня╕П Next

Lesson 10 тАФ scheduling & automation: the bell, and the backup that never runs twice at once.

тЖР Previouserrors safetyNext тЖТscheduling

This page is the lesson's README from the lesson-09-processes-jobs branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.