Linux troubleshooting: server গোলমাল করলে যে কমান্ড চালাবেন

Server ধীর বা অ্যাপ বন্ধ হলে এই কমান্ডগুলো ক্রমে চালান: load, memory, disk, process, port, log, network।

Linux server-এ uptime, free ও df চালানো একটি terminal

Server গোলমাল করলে অনেকে ঘাবড়ে সব restart করে দেন। শান্ত পথ হলো আগে দেখা: কয়েকটি read-only কমান্ডের ক্রম বলে দেয় সমস্যা CPU, memory, disk, বন্ধ হওয়া process, বন্ধ port নাকি network-এর। নিচের সব কমান্ড শুধু তথ্য পড়ে, তাই চালু server-এ চালানো নিরাপদ। নমুনা আউটপুট উদাহরণমাত্র: আপনার সংখ্যা আলাদা হবে। কমান্ডগুলো নিজে প্রকাশের আগে একটি Linux server-এ যাচাই করা হয়েছে (lsof সব সিস্টেমে ডিফল্ট থাকে না)।

সময় বাঁচানো ক্রম

১. Server চালু ও চাপে আছে কি? (uptime) ২. Memory শেষ? (free -h) ৩. Disk ভরা? (df -h, du) ৪. কী resource খাচ্ছে? (top, ps) ৫. অ্যাপ port-এ শুনছে? (ss -ltnp) ৬. Log কী বলছে? (journalctl) ৭. Network-ই কি সমস্যা? (ping, curl, dig)

১. Load: uptime

$ uptime
 03:08:23 up 30 days, 18:00,  4 users,  load average: 0.72, 0.61, 0.42

তিনটি load average শেষ ১, ৫ ও ১৫ মিনিটের। এগুলো CPU core-এর সংখ্যার (nproc) সঙ্গে তুলনা করুন। ৪ core মেশিনে load ৪ মানে পুরো ব্যস্ত, ৪-এর অনেক ওপরে মানে process লাইনে দাঁড়িয়ে। ১ মিনিটের সংখ্যা ১৫ মিনিটের চেয়ে অনেক বেশি হলে সমস্যা নতুন। ধীর disk-এর জন্য অপেক্ষাতেও high load হতে পারে, শুধু CPU-তে নয়।

২. Memory: free -h

$ free -h
               total        used        free      shared  buff/cache   available
Mem:           5.8Gi       3.0Gi       493Mi        46Mi       2.6Gi       2.8Gi

free কম দেখে ঘাবড়াবেন না। Linux ফাঁকা memory cache হিসেবে ব্যবহার করে (buff/cache) এবং দরকারে ফেরত দেয়। available দেখুন: নতুন প্রোগ্রাম যা ব্যবহার করতে পারবে তার আনুমানিক পরিমাণ। available শূন্যের কাছে ও swap বেশি ব্যবহৃত হলে আসল memory সমস্যা। Kernel কিছু মেরে ফেলেছে কি না দেখুন: journalctl -k | grep -i "out of memory" (OOM killer)।

৩. Disk: df -h ও du

$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        79G   56G   19G  75% /

$ sudo du -xh /var --max-depth=1 | sort -h | tail -5

Disk ভরলে অদ্ভুত ব্যর্থতা হয়: database লেখা প্রত্যাখ্যান করে, log থেমে যায়, deploy ব্যর্থ হয়। df প্রতিটি filesystem দেখায়; du খোঁজে কোন folder বড় (-x এক filesystem-এ থাকে, sort -h মানুষের পড়ার আকার সাজায়)। সাধারণ দোষী: log, Docker image ও পুরোনো backup। df -i দিয়ে inode-ও দেখুন: জায়গা থাকতেও ফাইল-এন্ট্রি শেষ হতে পারে।

৪. Process: top ও ps

$ ps aux --sort=-%mem | head -5
$ ps aux --sort=-%cpu | head -5
$ top          # M চাপলে memory, P চাপলে CPU অনুযায়ী সাজে, q দিয়ে বের হন

এগুলো সবচেয়ে বেশি memory ও CPU ব্যবহারকারী দেখায়। PID (process id) ও কমান্ড লিখে রাখুন। top-এর CPU লাইনে wa মানে disk-এর জন্য অপেক্ষার সময়। D অবস্থার process I/O-তে আটকে, Z অবস্থার process zombie। প্রথমেই kill -9 দেবেন না। সাধারণ kill PID (SIGTERM) চেষ্টা করুন যাতে প্রোগ্রাম পরিষ্কারভাবে বন্ধ হতে পারে; সাড়া না দিলে তবেই -9।

৫. Port: ss

$ sudo ss -ltnp
State  Recv-Q Send-Q Local Address:Port  Peer Address:Port  Process
LISTEN 0      4096         0.0.0.0:443         0.0.0.0:*    users:(("nginx",pid=812))
LISTEN 0      4096       127.0.0.1:3000        0.0.0.0:*    users:(("node",pid=2056))

-l শোনা socket, -t TCP, -n সংখ্যায়, -p process। অ্যাপ 3000 port-এ থাকার কথা কিন্তু নেই মানে সেটি চলছে না বা crash করেছে। ঠিকানাও পড়ুন: 127.0.0.1:3000 শুধু এই মেশিন থেকে পৌঁছানো যায়, আর 0.0.0.0:3000 বাইরে থেকেও। 0.0.0.0-এ শোনা database firewall দিয়ে সুরক্ষিত বা localhost-এ বাঁধা থাকা উচিত। এই দ্রুত পরীক্ষা নিরাপত্তার অভ্যাসও: আপনার server-এ কী শুনছে জানুন।

৬. Log: journalctl

$ journalctl -u myapp -n 100 --no-pager     # এক service-এর শেষ ১০০ লাইন
$ journalctl -u myapp -f                    # সরাসরি অনুসরণ
$ journalctl -p err --since "1 hour ago"    # শেষ ১ ঘণ্টার শুধু error
$ systemctl status myapp                    # অবস্থা, exit code ও সাম্প্রতিক log লাইন

Log সাধারণত আসল কারণ বলে: অনুপস্থিত environment variable, প্রত্যাখ্যাত database connection, অনুমতির error। শুধু শেষ লাইন নয়, crash-এর পরের প্রথম error পড়ুন। systemd-র বাইরের ফাইলের জন্য tail -f /var/log/nginx/error.log।

৭. Network: ping, curl, dig

$ curl -I https://example.com               # header ও status code
$ curl -sS -o /dev/null -w "%{http_code} %{time_total}s\n" https://example.com
$ dig +short example.com                     # DNS resolve হচ্ছে?
$ ip -brief addr                             # interface ও ঠিকানা

স্তর আলাদা করুন: dig ব্যর্থ হলে DNS; DNS চললে কিন্তু curl timeout হলে routing বা firewall; curl সংযুক্ত হয়ে 502 দিলে proxy-র পেছনের অ্যাপ বন্ধ। ping ইচ্ছা করে বন্ধ থাকতে পারে, তাই শুধু ping ব্যর্থ হলে বেশি কিছু প্রমাণ হয় না।

সহজ সিদ্ধান্ত নির্দেশিকা

লক্ষণ আগে দেখুন
পুরো server ধীর uptime, top, free -h
সাইট 502 বা 503 দিচ্ছে systemctl status, journalctl -u, ss -ltnp
ফাইল লেখা বা database ব্যর্থ df -h, df -i
অ্যাপ হঠাৎ মারা যাচ্ছে out of memory-র জন্য journalctl -k
স্থানীয়ভাবে চলে, বাইরে থেকে না ss -ltnp-এর ঠিকানা, firewall, বাইরে থেকে curl
deploy-এর পর ধীর log, তারপর আগের সংস্করণের সঙ্গে তুলনা

সহায়ক অভ্যাস

  • একবারে একটি জিনিস বদলান এবং লিখে রাখুন।
  • প্রথম ধাপে restart করবেন না। restart memory-র অবস্থা ও process তালিকার মতো প্রমাণ মুছে দেয়। আগে log পড়ুন।
  • ঠিক করার আগে দরকারি আউটপুট সংরক্ষণ করুন: journalctl -u myapp --since "1 hour ago" > issue.log।
  • ব্যবহারকারীর আগে সমস্যা ধরতে monitoring ও alert বসান।
  • প্রতিটি service-এর জন্য ছোট runbook লিখুন: কীভাবে দেখবেন, restart করবেন ও rollback করবেন।

মূল কথা: স্তরে স্তরে troubleshoot করুন, আগে read-only: load, memory, disk, process, port, log, network। উত্তর সাধারণত log-এ থাকে, আর শান্ত checklist ঘাবড়ানো restart-এর চেয়ে ভালো।


Linux ও DevOps সিরিজ, পর্ব ৩ (প্রতিদিনের পরিচালনা): 2 নম্বর (মোট 5)। আগের লেখা: Docker Compose: একটি ফাইলে multi-container অ্যাপ চালান.

আরও পড়ুন

Python দিয়ে এলোমেলো CSV পরিষ্কার: নাম, তারিখ, ফোন ও ডুপ্লিকেট

আসল data এলোমেলো। standard library দিয়ে contacts পরিষ্কার করা, প্রতিটি বাতিল row ব্যাখ্যা করা ও test-সহ একটি script বানান।

প্রজেক্ট•৫ মিনিটে পড়া