beginner 22 min read ·
Linux Fundamentals for Engineers
The Linux mental model every backend and DevOps engineer should carry — processes, file descriptors, signals, and the shell as glue.
The four primitives
You can model 90% of Linux with four ideas:
- Processes — running programs, identified by PID, organized in a tree.
- File descriptors — small integers naming open files, sockets, pipes.
- Signals — async notifications between processes (SIGTERM, SIGKILL, SIGHUP).
- The filesystem — the namespace through which everything is addressed, including non-files.
Everything is a file
Sockets, devices, pipes, even directories — all addressable as paths with read/write semantics. This is what makes shell composition work:
curl -s https://api.example.com/users | jq '.[] | .email' | sort -u > emails.txt
Each | is a kernel pipe — a buffered FIFO between two processes’ file descriptors. The shell wires the descriptors; the kernel does the rest.
Processes and signals
SIGTERM asks a process to clean up and exit. SIGKILL cannot be caught — the kernel just removes the process. Always trap SIGTERM in long-running services so you flush buffers, close connections, and exit cleanly.
Why this matters for application code
- Your web server’s worker count is bounded by available file descriptors.
ulimit -nmatters. - Container orchestrators send
SIGTERMthenSIGKILLafter a grace period. Apps that ignore SIGTERM lose data. /proc/self/...is the introspection API you didn’t know existed.
Once Linux stops being magic, ops stops being scary.