Skip to main content
JobCannon
All skills

Linux / Unix

Command line mastery, shell scripting, system administration

β¬’ TIER 3Tech
+$15k-
Salary impact
5 months
Time to learn
Medium
Difficulty
1
Careers
TL;DR

Linux/Unix is the foundation for backend, DevOps, and infrastructure engineering: mastery of command-line tools, shell scripting, system administration, and networking opens paths to high-paying roles. Career path: Foundation (basic commands, file permissions, $80-110k) β†’ Intermediate (shell scripting, process management, systemd, $110-160k) β†’ Advanced (kernel tuning, performance optimization, security hardening, $160-220k) over 4-6 months. Essential skills: bash, systemd, iptables/nftables, log analysis, SSH tunneling, cron jobs.

What is Linux / Unix

Linux/Unix = operating system knowledge. Essential for DevOps, backend engineers. Boost: +$15k-$35k

πŸ”§ TOOLS & ECOSYSTEM
bashzshsystemdjournalctliptablesnftablestcpdumpstracehtopvimtmuxsshGNU coreutilsawksedgrepcronSSH tunneling

πŸ’° Salary by region

RegionJuniorMidSenior
USA$95k$145k$195k
UKΒ£55kΒ£90kΒ£130k
EU€60k€100k€145k
CANADAC$100kC$155kC$210k

🎯 Careers using Linux / Unix

❓ FAQ

Which Linux distro should I learn first β€” Ubuntu, Red Hat, Debian, or Alpine?
Start with Ubuntu LTS (easiest, Debian-based, largest community, free). Learn one distro deeply first (how it boots, package manager, systemd), then distro-agnostic skills transfer everywhere. Red Hat (RHEL) is enterprise standard; CentOS/Rocky Linux are free alternatives. Alpine for containers (minimal, musl libc). For production jobs: Ubuntu or RHEL cover 80% of roles.
How do I debug systemd services when they fail?
Use `systemctl status <service>` for quick status. `journalctl -u <service> -n 50` for last 50 lines of logs. `journalctl -u <service> --no-pager` for full logs. `journalctl -u <service> -f` to tail in real-time. `systemctl restart <service>` to restart. Check ExecStart path, User permissions, Dependencies. For failed-to-start: `systemctl list-dependencies <service>` shows what it needs. Master journalctl β€” it's your debugging lifeline.
File permissions are confusing. What's the difference between chmod, ACLs, and SELinux?
chmod (mode): 3 layers of 3 bits (owner/group/other Γ— read/write/execute). ACLs (access control lists): fine-grained per-user/group perms, `setfacl -m u:user:rwx file`. SELinux: mandatory access control (MAC), role-based policies β€” overkill for most; just know it exists and how to disable it in contexts where it blocks things. For 99% of cases: chmod is enough. ACLs when you need per-user exceptions.
I'm drowning in logs. How do I analyze thousands of lines at scale?
`journalctl` with filters: `journalctl --since '1 hour ago' -u service`. `grep` for patterns: `grep 'ERROR' /var/log/app.log | wc -l` counts errors. `awk` to extract fields: `awk '{print $1, $3}' logfile` pulls columns. `sed` for replacements. `tail -f` to live-stream. Use log aggregation (ELK, Splunk, Datadog) for multi-host analysis. For local debugging: combine journalctl + grep + awk.
System is slow. How do I tune performance with sysctl and kernel parameters?
Use `htop` to profile CPU/RAM/disk. `iostat` for disk I/O. `netstat` for network. Tune kernel params via `/etc/sysctl.conf`: increase `net.core.somaxconn` for high-traffic services, `net.ipv4.tcp_tw_reuse=1` for short-lived connections, `fs.file-max` for file descriptors. Apply with `sysctl -p`. Profile first (know your bottleneck), then tune. Each parameter change should reduce a specific metric β€” don't spray-and-pray.
Package management is different on every distro. How do I keep track?
Debian/Ubuntu: `apt-get install`, `apt list --installed`, `apt remove`. Red Hat/CentOS: `yum install` (or `dnf` on newer versions), `yum list installed`, `yum remove`. Alpine: `apk add`, `apk info`, `apk del`. Key concept is same: install/list/remove. Distro-agnostic tools: `snap` (cross-distro packages, slower) and `flatpak` (less common). For servers: stick to your distro's native manager. Most jobs use Ubuntu (apt) or RHEL (yum), so learn those deeply.
I need to SSH tunnel through a bastion host to reach a private database. How?
`ssh -L 5432:internal-db:5432 bastion-host` binds local port 5432 to the internal database through the bastion. Use `ssh-key-gen` and `ssh-copy-id` to avoid password prompts. For reverse tunnels (expose a local service to remote): `ssh -R 8080:localhost:3000 remote-host`. Store tunnel config in `~/.ssh/config` with Host entries for reuse. Test with `netstat -tlnp` to confirm port is listening.

Not sure this skill is for you?

Take a 10-min Career Match β€” we'll suggest the right tracks.

Find my best-fit skills β†’

Find your ideal career path

Skill-based matching across 2,536 careers. Free, ~10 minutes.

Take Career Match β€” free β†’