دليل المطورين ومديري النظم لاحتراف أهم أوامر لينكس

اوامر لينكس
0

يجب على كل مدير نظم أو مطور تعلم بعض أوامر إدارة النظام الأساسية حيث يمكن لأوامر وحزم معينة أن تساعد المطورين على تنظيم وإدارة واستكشاف أخطاء التطبيقات ومحاولة إصلاحها، كما تزودهم بمعلومات مفيدة عن حالة النظام والتطبيقات. سواء كنت مطوراً أو تريد إدارة تطبيقاتك فحسب فإن اوامر لينكس ستساعدك على فهم أفضل لتطبيقاتك، أو تعطيك القدرة على وصف المشاكل التي تعترض لها في العمل لمديري الأنظمة لإصلاحها، مثلا لماذا يعمل التطبيق محلياً ولكنه ليس على المضيف البعيد؟ تطبق هذه الأوامر ضمن بيئة لينكس والنظام الحاسوبي الذي يحوي أنظمة وهمية مثبتة عليه مباشرة (bare metal environment).

اقرأ أيضًا: أفضل توزيعات نظام لينكس المناسبة لوحوش البرمجة وعمالقة التكويد

curl

يستخدم لنقل الملفات باستخدام رابط URL عبر سطر الأوامر ويستخدم هذا الأمر أيضاً لفحص اتصال التطبيقات مع خدمة ما بمعنى آخر تحديد فيما إذا كان تطبيقك يستطيع الوصول إلى خدمة معينة مثل قاعدة بيانات، أو التحقق إن كانت الخدمة بحد ذاتها تعمل بشكل صحيح.
لنفترض مثلاً أن تطبيقك يظهر الخطأ HTTP 500 الذي يشير إلى عدم قدرته على الوصول إلى قاعدة البيانات MongoDB.

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

الخيار ‎-I (أو ‎–head) يظهر معلومات ترويسة http فقط، والخيار ‎-s (أو ‎–silent) يُخفي تفاصيل تقدم العملية أو رسائل الخطأ. يمكنك في هذه الحالة تفقُّد نقطة النهاية لقاعدة بياناتك من حاسوبك المحلي كما يلي:

$ 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'

يشير ذلك إلى أن تطبيقك لا يستطيع أن يستبين عنوان خادوم قاعدة البيانات. إما أن يكون غير متوافر أو أن المضيف (الجهاز الافتراضي) لا يملك اسم خادوم ليستبين عن اسم المضيف.


python -m json.tool / jq

تحتاج أحياناً إلى طباعة المخرجات بصيغة جميلة ومنسقة وقابلة للقراءة للبحث عن مدخلات معينة وهذا ما توفره 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"]}

سنستخدم صيغة JSON في الأمر التالي مع الخيار 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"
}

ls

لإظهار قائمة بالملفات الموجودة داخل مجلد، ويستخدمه مديرو الأنظمة والمطورون بكثرة حيث يمكن استخدام هذا الأمر لإيجاد ملف ما بالإضافة إلى عرض صلاحياته.
في المثال التالي تشغيل الملف myapp ولكننا لم نستطع بسبب مشكلة الصلاحيات. عند تفحص الصلاحيات عبر الأمر ls -l وجدنا أن الملف صالح للقراءة والكتابة فقط:

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

tail

يظهر الجزء الأخير من الملف. لا تحتاج غالباً إلى قراءة جميع أسطر الملف أو السجل أثناء البحث ضمنهم عن مشكلة أو عطل ما ولكن قد تكون البيانات الأخيرة (الأحدث) هي الأهم. تستطيع استعمال الأمر tail لفحص ومعرفة ماذا يحدث في السجلات عند إصدار طلب إلي Apache HTTP server.

[root@localhost ~]# tail -f /var/log/httpd/access_log
::1 - - [21/Jul/2017:18:46:58 +0000] GET / HTTP/1.1 403 4897 “-” curl/7.29.0
::1 - - [21/Jul/2017:18:47:00 +0000] GET / HTTP/1.1 403 4897 “-” curl/7.29.0
::1 - - [21/Jul/2017:18:47:02 +0000] GET / HTTP/1.1 403 4897 “-” curl/7.29.0
::1 - - [21/Jul/2017:18:47:04 +0000] GET / HTTP/1.1 403 4897 “-” curl/7.29.0
::1 - - [21/Jul/2017:18:47:06 +0000] GET / HTTP/1.1 403 4897 “-” curl/7.29.0
::1 - - [21/Jul/2017:18:47:08 +0000] GET / HTTP/1.1 403 4897 “-” curl/7.29.0
::1 - - [21/Jul/2017:18:47:10 +0000] GET / HTTP/1.1 403 4897 “-” curl/7.29.0
::1 - - [21/Jul/2017:18:47:12 +0000] GET / HTTP/1.1 403 4897 “-” curl/7.29.0
::1 - - [21/Jul/2017:18:47:14 +0000] GET / HTTP/1.1 403 4897 “-” curl/7.29.0
::1 - - [21/Jul/2017:18:47:16 +0000] GET / HTTP/1.1 403 4897 “-” curl/7.29.0

 

الخيار ‎-f يظهر أسطر السجل أو الملف التي تضاف إليه حديثاً، وهذا واضح من المثال السابق. يمكن إظهار عدد محدد من الأسطر عوضاً عن تتبع تحديثات الملف وإظهارها مثل إظهار آخر 100 سطر من الملف عبر الخيار ‎-n.

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

cat

يعمل هذا الأمر على دمج الملفات أو طباعتها كما يستخدم للتحقق من محتويات الملفات.

$ cat requirements.txt
flask
flask_pymongo

نتأكد في المثال السابق إن كان إطار العمل Flask، وهو إطار عمل مصغر لتطوير تطبيقات ويب صغيرة ومتوسطة، مدرجاً ضمن القائمة التي يعتمد عليها التطبيق Python Flask.


grep

هي أداة قوية في مطابقة أنماط نصية داخل الملفات. إن كنت تبحث عن نمط نصي معين داخل ملف أو في مخرجات أمر آخر فيمكن استخدام هذه الأداة للبحث عن هذا النمط وتحديد مكان وجوده.
لنفترض مثلاً أنك تريد التأكد من عمل الخادم Apache Tomcat، ستعجز عن قراءة الكثير من الأسطر للبحث عنه لذا يمكن إرسال المخرجات إلى الأمر 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

يظهر حالة العمليات التي تعمل حالياً في النظام، يستعمل لتحديد التطبيقات التي تعمل أو للتأكد من عملية ما، فإذا أردت التحقق من عمل خادم الويب Tomcat، استعمل الأمر ps مع الخيارات التالية للحصول على رقم العملية لهذا الخادم.

$ 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

ولتجنب قراءة الكثير من الأسطر والعمليات، أرسل المخرجات السابقة إلى الأداة grep كما يلي:

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

env

يتيح عرض متغيرات البيئة التي ضبطت من أجل طرفية معينة. قد يكون من المفيد في أثناء البحث عن المشاكل والأخطاء التأكد من عدم وجود متغير خاطئ يمنع تطبيقك من البدء.
سنستخدم الأمر 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

لاحظ أن التطبيق يستخدم “بايثون 3” ويحوي متغيراً لبيئة الاتصال بقاعدة البيانات MongoDB.


top

يطبع قائمة بالعمليات التي تجري في النظام بطريقة أكثر تفاعلية من الأمر ps كما يرتب العمليات حسب نشاطها. يمكن باستخدام هذه الأداة تحديد كمية الذاكرة والمعالج التي تستهلكها كل عملية. قد تحدث حالة شائعة عند تشغيل تطبيق وهي توقفه عن العمل ثم جموده، فيجب أولاً في هذه الحالة التحقق من الخطأ الذي يظهره التطبيق والذي قد يكون خطأ في الذاكرة.

$ tail myapp.log
Traceback (most recent call last):
MemoryError

هل حقاً الذاكرة لا تكفي أو يوجد خطأ فيها؟ للتأكد من ذلك نستخدم الأمر top لمعرفة كمية الذاكرة والمعالج التي يستهلكها التطبيق. عند تنفيذ الأمر نلاحظ أن التطبيق “بايثون” يستخدم نسبة كبيرة من المعالج والذاكرة.

الأمر top

أثناء تشغيل الأداة top اضغط على C لرؤية موقع الأمر كاملًا وربط كل عملية مع تطبيق محدد.

الأمر top


netstat

يستخدم في عرض حالة الشبكة والمنافذ المستخدمة والاتصالات الواردة عبرها. هذه الأداة لا تكون مدمجة في لينكس لذا تحتاج إلى تثبيتها عبر الحزمة net-tools. من المحتمل أن تصادف خطأ يشير إلى أن المنفذ محجوز أو العنوان مستخدم حالياً… إلخ. فيمكن استعمال الأمر netstat لتحليل وفحص الأعطال لمحاولة إصلاحها. يوضح المثال التالي أن Apache HTTP server يستخدم المنفذ 80 على الجهاز عند تنفيذ الأمر التالي:

الأمر netstat


ip address

يعمل الأمر ip address على عرض الواجهات وعناوين IP لتطبيقات المضيف أو التحقق من عنوان IP معين. إن لم يكن الأمر موجوداً يمكنك تثبيته عبر الحزمة iproute2.

إن كان سيرفرك متصل مع شبكتين فإن الأمر ip address يبين الواجهة المتصلة مع كل شبكة؛ يمكن أيضاً استخدام هذا الأمر للحصول على عنوان IP للجهاز المضيف. يوضح المثال التالي أن عنوان IP لسيرفر الويب على الواجهة eth0 هو 172.17.0.2:

الأمر ip address


lsof

يستخدم لسرد قائمة بالملفات المفتوحة وربطها مع التطبيقات قد لا يتواجد هذا الأمر في بعض توزيعات لينكس لذا ثبت الحزمة lsof.

يستخدم أيضاً هذا الأمر بصورة مشابهة للأمر netstat وذلك في عرض المنافذ المتصلة. إن أردت التحقق من كون المنفذ 80 مستخدماً حالياً أو لا فاستعمل الأمر lsof مع الخيار ‎-i الذي يعطي قائمة بالملفات المفتوحة المرتبطة باتصال عبر الشبكة الموافقة لما بعد الخيار. توضح الصورة التالية Apache HTTP server يتصل على المنفذ 80. يمكن إعادة استخدام الأمر نفسه بإضافة الخيار ‎-p مع رقم العملية لتحديد الاسم الأصلي للعملية ومكان وجودها على الجهاز وهذا مفيد مع Apache HTTP server.

الأمر lsof


df

يستخدم لإظهار مساحة القرص المستخدمة والمتوافرة لإصلاح المشاكل المرتبطة بالتخزين. عند تشغيل تطبيق قد تظهر رسالة خطأ تشير إلى انخفاض المساحة المتوافرة وحينئذ يمكن استخدام الأمر df للتأكد من صحة هذا الخطأ وأنه لم تعد هنالك مساحة متوافرة إذ إن مدير النظام هو المسؤول عن إدارة وتحسين مساحة القرص. توضح الصورة مساحة القرص لجميع أنظمة الملفات الموجودة:

الأمر df

الخيار ‎-h (أو ‎–human-readable) هو لإظهار الحجم بصيغة مقروءة.


du

يستخدم للحصول على معلومات تفصيلية عن حجم الملفات الموجودة داخل مجلد. إن أردت معرفة حجم السجلات الموجودة في المجلد ‎/var/log، على سبيل المثال، وأي السجلات حجمه أكبر نفذ الأمر du مع الخيار ‎-h لتسهيل قراءة حجم الملفات والخيار ‎-s لعرض الحجم الكلي.

$ du -sh /var/log/* 
1.8M /var/log/anaconda 
384K /var/log/audit 
4.0K /var/log/boot.log 
0 /var/log/chrony 
4.0K /var/log/cron 
4.0K /var/log/maillog 
64K /var/log/messages

id

يستخدم لعرض معلومات عن هوية مستخدم ومجموعة محددة أو المستخدم الحالي والمجموعة التي ينتمي إليها.

في المثال التالي استخدمنا الأداة Vagrant -وهي أداة للعمل ضمن بيئة افتراضية- لاختبار التطبيق وعزله في بيئة تطويرية. بعد الدخول إلى صندوق Vagrant حاولنا تثبيت Apache server ولكن النظام لم يسمح بتنفيذ الأمر لأن تنفيذه يتطلب صلاحيات الأدمن (root)، لذا نستخدم الأمر id لمعرف هوية المستخدم الحالي.

$ yum -y install httpd 
Loaded plugins: fastestmirror 
You need to be root to perform this command. 
$ id 
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

ولتنفيذ الأمر السابق يجب اختيار مستخدم ذي صلاحيات أعلى.


chmod

تصادف أحياناً عند تشغيل تطبيق لأول مرة على حاسوبك رسالة الخطأ “الإذن مرفوض” لذا تأكد من الصلاحيات باستخدام الأمر ls.

$ ls -l 
total 4 
-rw-rw-r--. 1 vagrant vagrant 34 Jul 11 02:17 test.sh

نلاحظ من المثال أن المستخدم لا يملك صلاحية التنفيذ (عدم وجود x) لتشغيل التطبيق؛ نلجأ حينها إلى الأمر chmod لتغيير الصلاحيات وتمكين المستخدم من تشغيل التطبيق وذلك بكتابة الأمر التالي:

$ chmod +x test.sh 
[vagrant@localhost ~]$ ls -l 
total 4 
-rwxrwxr-x. 1 vagrant vagrant 34 Jul 11 02:17 test.sh

لاحظ وجود إذن التنفيذ (وجود x) ضمن صلاحيات الملف وإن جربنا الآن تشغيله فلن تظهر رسالة الخطأ السابقة.


dig / nslookup

يساعد DNS على تحويل العنوان URL إلى عنوان IP، وإن لم يحول هذا العنوان فستحدث مشكلة في الاتصال. لنفترض أنك تريد الوصول إلى قاعدة بياناتك (mydatabase) من تطبيقك ولكنك لا تستطيع إذ تظهر رسالة خطأ “لا يمكن استبيان العنوان” (cannot resolve). جرب استخدام الأداة dig للبحث عن أسماء النطاقات DNS أو الأداة nslookup للاستعلام عن خوادم أسماء النطاقات لحل هذه المشكلة ومعرفة سبب عدم تمكن التطبيق من استبيان اسم نطاق قاعدة البيانات.

$ nslookup mydatabase 
Server: 10.0.2.3 
Address: 10.0.2.3#53 

** server can't find mydatabase: NXDOMAIN

جربنا استعمال الأمر nslookup ولكن ظهرت رسالة بالخطأ نفسه أي لم يجد عنوانًا لاسم نطاق قاعدة البيانات.

إن جربت الأمر dig فستحصل على النتيجة نفسها.

$ dig mydatabase 

; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> mydatabase 
;; global options: +cmd 
;; connection timed out; no servers could be reached

هنالك احتمالات كثيرة تفسر سبب حدوث هذا الخطأ ليست ضمن موضوع هذه المقالة. تواصل مع مدير النظام المسؤول إن لم تستطع حل المشكلة ليساعدك بالبحث عن سبب المشكلة وحلها. إن لم يكن هذان الأمران موجودان على حاسوبك، فثبت الحزمة BIND Utilities.


iptables

هو جدار ناري موجود في أغلبية توزيعات لينكس ووظيفته هي سماح أو حجب حركة مرور البيانات الشبكية. قد يمنع الجدار الناري تطبيقات معينة من استلام أو نقل البيانات عبر الشبكة. إن كان أحد التطبيقات لديك يواجه صعوبة في الوصول إلى خدمة أو موقع معين فقد يكون هذا الجدار الناري هو السبب في منع حركة البيانات من الوصول إلى تلك الخدمة أو الموقع.

لنفرض أن التطبيقات لا تتمكن من الوصول إلى الموقع opensource.com، نتأكد أولاً من الاتصال عبر الأداة curl:

$ curl -vvv opensource.com 
* About to connect() to opensource.com port 80 (#0) 
* Trying 54.204.39.132... 
* Connection timed out 
* Failed connect to opensource.com:80; Connection timed out 
* Closing connection 0 
curl: (7) Failed connect to opensource.com:80; Connection timed out

فشل الاتصال مع الموقع بعد انقضاء المهلة. قد يكون هنالك ما يمنع من الاتصال مع ذلك الموقع لذا نستعمل الأمر iptables مع الخيار ‎-S لعرض قواعد الجدار الناري:

$ iptables -S 
-P INPUT DROP 
-P FORWARD DROP 
-P OUTPUT DROP 
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 
-A INPUT -i eth0 -p udp -m udp --sport 53 -j ACCEPT 
-A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT 
-A OUTPUT -o eth0 -p udp -m udp --dport 53 -j ACCEPT

الواضح أن الضبط الافتراضي للقواعد الثلاثة الأولى هي “تجاهل”  البيانات الشبكية المرسلة والمستقبلة أما القواعد الأخرى فهي “السماح” بمرور البيانات عبر خادوم SSH و DNS. استشر في هذه الحالة مدير الأنظمة إذا كان هنالك حاجة لإضافة أو تعديل قاعدة للسماح بحركة البيانات للموقع السابق. إن كان المضيف الذي تستخدمه هو بيئة محلية أو للاختبار المحلي فاستخدم iptables للسماح بمرور البيانات غير الضارة.


sestatus

توفر هذه الآلية إمكانية الوصول للعمليات المشغلة حالياً بأدنى الصلاحيات إذ يحتمل أن بعض تلك العمليات ضار وبذلك تمنع من الوصول إلى الملفات المهمة على النظام. قد يحتاج أحد التطبيقات أحياناً الوصول إلى ملف ما ولكنه لا يستطيع فتظهر رسالة خطأ بذلك؛ يجب التأكد إن كان SELinux يمنع هذا التطبيق من الوصول باستعمال الأمر tail مع grep للبحث عن الرسالة “denied” في السجل ‎/var/log/audit. قد لا يكون SELinux مفعلاً منذ البداية لذا من المفيد التحقق أولاً من ذلك عبر الأمر sestatus.

$ sestatus 
SELinux status:				enabled 
SELinuxfs mount:			/sys/fs/selinux 
SELinux root directory:			/etc/selinux 
Loaded policy name: 			targeted 
Current mode:				enforcing 
Mode from config file:			enforcing 
Policy MLS status:			enabled 
Policy deny_unknown status:	 	allowed 
Max kernel policy version: 		28

نجد من الرسالة السابقة أن SELinux مفعل؛ يستطيع مدير النظام مساعدتك في هذا الشأن وتحديد إن كان التطبيق يستحق الوصول إلى الملفات التي يحتاجها. أضف إلى ذلك أنه من المفيد تحديث SELinux دوما على بيئتك التطويرية المحلية ليصبح أكثر تساهلاً.


history

بعد تنفيذ الكثير من الأوامر سواء للتجريب أو لإصلاح بعض المشاكل، لابد أن نشير إلى الأمر history الذي لا تكاد تخلو صدفية (shell) منه. مهمة هذا الأمر هي طباعة جميع الأوامر التي استخدمتها منذ بدء استخدامك للصدفية. تكمن فائدته بتسجيل الأوامر المستخدمة لإصلاح مشكلة ما وإعادة تذكرها أو تنفيذها.

إن نفذنا هذا الأمر فستظهر جميع الأوامر التي تعلمتها وجربتها خلال هذه المقالة:

$ history 
	1 clear 
	2 df -h 
	3 du

إن أردت تنفيذ أحد هذه الأوامر السابقة فلن تحتاج لإعادة كتابته، فقط استخدم الرمز ! وأتبعه برقم الأمر الذي تود تنفيذه مجددًا.

الأمر history

 

0

شاركنا رأيك حول "دليل المطورين ومديري النظم لاحتراف أهم أوامر لينكس"

أضف تعليقًا