اگر به دنبال افزایش اطلاعات خود به عنوان یک ادمین سرورهای لینوکس هستید، این ۲۰ دستور لینوکس به کارتان خواهد آمد. در این بخش از این مقاله ابتدا ده مورد از این دستورها را با هم بررسی می‌کنیم.
هم‌اکنون در دنیایی که مملو از ابزارهای جدید و محیط‌های نرم‌افزاری مختلف است، برای هر مهندس نرم‌افزار نیاز به یادگیری فرمان‌های اصلی که در حیطه سرور لینوکس استفاده می‌شود امری اساسی است. یک سری دستورها و بسته‌های خاص می‌توانند به کمک توسعه دهندگان آمده و در بحث عیب‌یابی و بهینه سازی برنامه‌ها کمک بزرگی باشند. اگر یک توسعه‌دهنده تازه وارد به دنیای لینوکس هستید و یا می‌خواهید خودتان برنامه‌های‌تان را مدیریت کنید، ده دستورالعمل زیر می‌توانند به کمک شما بیایند. 
این دستورها هم‌چنین می‌توانند در مواردی نظیر توصیف عیب‌یابی سرور به شما کمک کنند؛ چرا که برای مثال ممکن است یک برنامه به صورت محلی کار کند اما به صورت ریموت خیر. از این فرمان‌های می‌توانید در محیط لینوکس، ماشین‌های مجازی و همین‌طور container‌ها استفاده کنید. 
 

Curl 


دستور کرل انتقال URL را انجام می‌دهد. از این دستور برای تست نقطه پایانی یک برنامه و وصل بودن آن استفاده می‌شود. دستور کرل در جهت آزمایش این موضوع که آیا برنامه شما می‌تواند با سرویس دیگری (مانند دیتابیس) ارتباط بگیرد و یا چک کردن این که آیا سرویس شما سالم است یا خیر مورد استفاده قرار می‌گیرد.
به عنوان مثال، فرض کنید که برنامه شما یک خطای HTTP500‌ ایجاد می‌کند که نشان‌دهنده این است که نمی‌تواند به پایگاه داده مونگودی‌بی شما دسترسی داشته باشد: 

$ curl -I -s myapplication:5000
HTTP/1.0 500 INTERNAL SERVER ERROR

 

آپشن -l اطلاعات هدر را نشان داده و آپشن -s response body‌ را ساکت می‌کند. اندپوینت دیتابیس را از دسکتاپ محلی‌تان چک کنید: 

$ curl -I -s database:27017
HTTP/1.0 200 OK

 

پس مشکل چه می‌تواند باشد؟ در این مرحله چک می‌کنیم که آیا برنامه‌مان به سایر نقاط پایانی غیر از دیتابیس دسترسی دارد یا خیر.

$ curl -I -s https://opensource.com
HTTP/1.1 200 OK

 

به نظر می‌رسد که مشکلی در این‌جا وجود ندارد؛ حال سعی می‌کنیم از میزبان برنامه به پایگاه داده دسترسی پیدا کنیم: 

$ curl database:27017
curl: (6) Couldn't resolve host 'database'

 

خطای بالا نشان می‌دهد که برنامه شما نمی‌تواند به پایگاه داده وصل شود چرا که نشانی اینترنتی پایگاه داده در دسترس نیست و یا اینکه میزبان nameserver ندارد که بتواند مشکل را حل کند. 

 

 python -m json.tool/jq

 

بعد از اینکه مشکل کرل را حل می‌کنید، ممکن است خواندن خروجی API دشوار باشد. برخی اوقات ممکن است بخواهید خروجی JSON چاپ کنید تا یک ورودی خاص را پیدا کنید. پایتون در این‌جا یک کتابخانه پیش‌ساخته دارد که به کمک‌تان خواهد آمد. می‌توانید از ابزار python -m json.tool استفاده کنید. برای استفاده از ماژول JSON پایتون خروجی یک فایل JSON را به کمک فرمان python -m json.tool، پایپ کنید. 
 

$ cat test.json
{"title":"Person","type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"age":{"description":"Age in years","type":"integer","minimum":0}},"required":["firstName","lastName"]}

 

برای استفاده از از کتاب‌خانه پایتون، خروجی را به ماژول -m پایپ کنید. 

$ cat test.json | python -m json.tool
{
    "properties": {
        "age": {
            "description": "Age in years",
            "minimum": 0,
            "type": "integer"
        },
        "firstName": {
            "type": "string"
        },
        "lastName": {
            "type": "string"
        }
    },
    "required": [
        "firstName",
        "lastName"
    ],
    "title": "Person",
    "type": "object"
}

 

برای این که از ویژگی‌های بیشتری در پارس کردن JSON بهره ببرید می‌توانید jq نصب کنید. jq گزینه‌هایی را برای استخراج مقادیر ویژه از ورودی JSON فراهم می‌کند. 

 

$ cat test.json | jq
{
  "title": "Person",
  "type": "object",
  "properties": {
    "firstName": {
      "type": "string"
    },
    "lastName": {
      "type": "string"
    },
    "age": {
      "description": "Age in years",
      "type": "integer",
      "minimum": 0
    }
  },
  "required": [
    "firstName",
    "lastName"
  ]
}

 

LS


دستور ls لیست فایل‌ها در یک دایرکتوری را برای‌تان نمایش می‌دهد. ادمین‌های دیتابیس و سرور لینوکس معمولا به مراتب از این دستور استفاده می‌کنند. این دستور در کنار این که به شما کمک می‌کند تا فایل‌های‌تان را پیدا کنید، به شما کمک می‌کند تا دسترسی‌های خود را نیز مرور کنید. 
در مثال پایین می‌بینید که نمی‌توانید myapp‌ را اجرا کنید و این به خاطر یک مشکل دسترسی است. وقتی با استفاده از دستور ls -l‌ دسترسی ها را بررسی می‌کنید متوجه خواهید شد که از یک متغیر “x” استفاده نمی‌شود و فقط دسترسی read‌ و write وجود دارد. 

 

$ ./myapp
bash: ./myapp: Permission denied
$ ls -l myapp
-rw-r--r--. 1 root root 33 Jul 21 18:36 myapp

 

tail


این دستور آخرین قسمت‌های یک فایل را نشان می‌دهد. معمولا برای عیب‌یابی نیاز به چندین خط لاگ ندارید. در عوض احتمالن صرفا می‌خواهید بدانید که چه بر سر آخرین درخواست‌تان آمده است. برای مثال می‌توانید از tail برای چک کردن این که در لاگ‌ها چه اتفاقی می‌افتد استفاده کنید.

می‌توانید از tail -f‌ استفاده کنید تا لاگ‌های آپاچی را دنبال کرده و درخواست‌های‌تان را به صورت real-time ببنید. 
-f نشان‌دهنده ویژگی follow است که فایل‌های لاگ را در حالی که نوشته می‌شوند به صورت هم‌زمان نشان می‌دهد. اما اگر نمی‌خواهید به صورت  real-time لاگ را دنبال کنید، می‌توانید از tail و آپشن -n استفاده کنید تا ۱۰۰ خط آخر را ببینید. 
 

$ tail -n 100 /var/log/httpd/access_log

 

 cat


دستور کت فایل‌ها را به هم پیوست داده و پرینت می‌کند. شما می‌توانید از این دستور برای چک کردن محتوای پیش‌نیازهای هر فایل استفاده کنید و یا ورژن اپلیکیشنی که در حال حاضر در اختیار دارید را چک کنید. 

$ cat requirements.txt
flask
flask_pymongo

 

 grep


دستور گرپ وظیفه جستجو بین الگوهای مختلف را در اختیار دارد. اگر به دنبال یک الگوی خاص در خروجی یک دستور دیگر هستید می‌توانید از گرپ استفاده کنید. از این دستور برای جستجو بین فایل‌های لاگ، پردازش‌های خاص و ... استفاده کنید. 

 

$ cat tomcat.log | grep org.apache.catalina.startup.Catalina.start
01-Jul-2017 18:03:47.542 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 681 ms

 

 ps


دستور ps بخشی از پکیج کاربردی procps-ng ست که از دستورهای مختلفی برای جستجو بین آیدی پروسه‌ها و وضعیت یک پردازش پشتیبانی می‌کند. از این دستور برای تعیین کردن وضعیت یک برنامه در حال اجرا و یا تایید کردن یک پردازش استفاده کنید. برای مثال اگر می‌خواهید وب‌سرور تامکت در حال اجرای یک سرور را چک کنید، می‌توانید از این دستور و آپشن‌هایی که در اختیارتان می‌گذارد برای نگهداری آیدی پروسه تام‌کت استفاده کنید. 

$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  2 18:55 ?        00:00:02 /docker-java-home/jre/bi
root        59     0  0 18:55 pts/0    00:00:00 /bin/sh
root        75    59  0 18:57 pts/0    00:00:00 ps -ef

 

برای در اختیار داشتن امکانات بیشتر، می‌توانید دستور ps و گرپ را باهم دیگر پایپ کنید.

$ ps -ef | grep tomcat
root         1     0  1 18:55 ?        00:00:02 /docker-java-home/jre/bi

 

env


دستور بالا به شما این امکان را می‌دهد که متغیرهای مختلف را پرینت کرده و یا تنظیم کنید. در طول عیب‌یابی ممکن است چک کردن متغیرهای مختلف به شما کمک کند تا مشکل برنامه‌تان را پیدا کنید. در مثال پایین این دستور برای چک کردن متغیرهای یک محیط (هاست برنامه) استفاده شده است. 

$ env
PYTHON_PIP_VERSION=9.0.1
HOME=/root
DB_NAME=test
PATH=/usr/local/bin:/usr/local/sbin
LANG=C.UTF-8
PYTHON_VERSION=3.4.6
PWD=/
DB_URI=mongodb://database:27017/test

 

 netstat

 

دستور نت‌استت، وضعیت شبکه را نشان می‌دهد. این دستور پرت‌های یک شبکه که در حال استفاده هستند و کانکشن‌های آن‌ها را نشان می‌دهد. هرچند که دستور netstat به طور پیش فرض بر روی لینوکس وجود نداشته و اگر بخواهید بایستی آن را نصب کنید. هم‌چنین می‌توانید با استفاده از پکیج net-tools‌ از آن استفاده کنید. 
به عنوان یک توسعه دهنده که به طور محلی (لوکال) کار می‌کند ممکن است خطایی دریافت کنید که یک پرت یا آدرس در حال استفاده است. استفاده از netstat در تصویر پایین نشان می‌دهد که پرت ۸۰ توسط سرور آپاچی در حال استفاده است. 

 

 

IP


اگر آدرس آی‌پی بر روی سرور لینوکس شما کار نمی‌کند بایستی با استفاده از iproute2 آن را نصب کنید. استفاده از آدرس آی‌پی برای تایید آدرس Ip هاست استفاده می‌شود؛ برای مثال زمانی که کانتینر شما به شبکه وصل است، آدرس آی‌پی نشان می‌دهد که کدام اینترفیس به کدام شبکه متصل است. 
یک تست ساده در این زمینه این است که از دستور ip address استفاده کنید تا آدرس آی‌پی هاست را پیدا کنید. مثال پایین نشانگر این موضوع است. 

$ ip address show eth0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether d4:3b:04:9e:b2:c2 brd ff:ff:ff:ff:ff:ff
    inet 10.1.1.3/27 brd 10.1.1.31 scope global dynamic noprefixroute eth0
       valid_lft 52072sec preferred_lft 52072sec