البحث في الموقع
المحتوى عن 'sysadmin'.
-
من الضروري على أي مطور أو مهندس تعلُّم بعض أوامر إدارة النظام الأساسيَّة خصوصًا في ظل غزو أدوات جديدة وبيئات متطورة ومتنوعة عالمنا بشكل دائم؛ يمكن لأوامر وحزم معيَّنة أن تساعد المطورين على تنظيم وإدارة واستكشاف أخطاء التطبيقات ومحاولة إصلاحها، كما تزودهم بمعلومات مفيدة عن حالة النظام والتطبيقات. سواءً كنت مطورًا جديدًا أو تريد إدارة تطبيقاتك فحسب فإنَّ الأوامر العشرون التي يشرحها هذا الدليل ، ستساعدك على فهمٍ أفضلٍ لتطبيقاتك، أو تعطيك القدرة على وصف المشاكل التي تعترضك في العمل لمديري الأنظمة لإصلاحها، مثلًا لماذا يعمل التطبيق محليًا ولكنه ليس على المضيف البعيد؟ تطبَّق هذه الأوامر ضمن بيئة لينكس والنظام الحاسوبي الذي يحوي أنظمة وهمية مثبتة عليه مباشرة (bare metal environment) والحاويات. 1. curl إنَّ 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' يشير ذلك إلى أنَّ تطبيقك لا يستطيع أن يستبين عنوان خادوم قاعدة البيانات إذ إمَّا أن يكون غير متوافر أو أنَّ المضيف (الحاوية أو الجهاز الافتراضي) لا يملك اسم خادوم ليستبين عن اسم المضيف. 2. python -m json.tool / jq بعد تنفيذ الأمر curl ستجد أن ناتجه صعب القراءة. تحتاج أحيانًا إلى طباعة المخرجات بصيغة جميلة ومنسَّقة وقابلة للقراءة للبحث عن مدخلات معيَّنة وهذا ما توفره صيغة البيانات 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 في الأمر التالي بإرسال المخرجات السابقة إلى بايثون. $ 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" } هل لاحظت الفرق؟! يمكن إظهار المخرجات أيضًا بطريقة متقدمة تشبه استخدام الأمر السابق وهو بتحويل المخرجات إلى الأداة jq والتي تحوي خيارات عدَّة للحصول على قيم محدَّدة من مدخلات صيغة JSON؛ يمكنك تثبيت jd من هذا الرابط. $ 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" ] } 3. ls يُستعمل الأمر ls لإظهار قائمة بالملفات الموجودة ضمن مجلد، ويستخدمه مديرو الأنظمة والمطورون بكثرة؛ يمكن أيضًا باستخدام هذا الأمر لإيجاد ملف معين ما بالإضافة إلى عرض أذوناته. حاولنا في المثال التالي تشغيل الملف myapp ولكنَّنا لم نستطع بسبب مشكلة الأذونات؛ عندما تفحصنا الأذونات عبر الأمر ls -l وجدنا أن الملف صالح للقراءة والكتابة فقط. $ ./myapp bash: ./myapp: Permission denied $ ls -l myapp -rw-r--r--. 1 root root 33 Jul 21 18:36 myapp 4. tail يُظهر الأمر tail الجزء الأخير من الملف؛ لا تحتاج غالبًا إلى قراءة جميع أسطر الملف أو السجل أثناء البحث ضمنهم عن مشكلة أو عطل ما ولكن قد تكون البيانات الأخيرة (الأحدث) هي الأهم. تستطيع مثلًا استعمال الأمر tail لفحص ومعرفة ما ذا يحدث في السجلات عندما تنشئ طلبية HTTP. [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 (أو –follow) يُظهر أسطر السجل أو الملف التي تُضاف إليه حديثًا، وهذا واضح من المثال السابق. يمكن إظهار عدد محدَّد من الأسطر عوضًا عن تتبع تحديثات الملف وإظهارها مثل إظهار آخر 100 سطر من الملف عبر الخيار -n. $ tail -n 100 /var/log/httpd/access_log 5. cat يعمل هذا الأمر على دمج الملفات أو طباعتها إلى مجرى الخرج القياسي كما يُستخدم للتحقق من محتويات الملفات. نتأكد في المثال التالي إن كان إطار العمل Flask، وهو إطار عمل مصغَّر لتطوير تطبيقات ويب صغيرة ومتوسطة، مُدرجًا ضمن القائمة التي يعتمد عليها التطبيق Python Flask. $ cat requirements.txt flask flask_pymongo 6. grep الأداة 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 7. ps يُظهر الأمر 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 8. env يتيح الأمر 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. 9. top يطبع الأمر top قائمة بالعمليات التي تجري في النظام بطريقة أكثر تفاعلية من الأمر ps كما يرتِّب العمليات حسب نشاطها ويحدِّث القائمة كلَّ ثلاث ثوانٍ؛ يمكن باستخدام هذه الأداة تحديد كمية الذاكرة والمعالج التي تستهلكها كلُّ عملية على حدة. قد تحدث حالة شائعة عند تشغيل تطبيق وهي توقفه عن العمل ثمَّ جموده، فيجب أولًا في هذه الحالة التحقق من الخطأ الذي يظهره التطبيق والذي قد يكون خطأ في الذاكرة. $ tail myapp.log Traceback (most recent call last): MemoryError هل حقًا الذاكرة لا تكفي أو يوجد خطأ فيها؟ للتثبُّت من ذلك نستخدم الأمر top لمعرفة كمية الذاكرة والمعالج التي يستهلكها التطبيق؛ عند تنفيذ الأمر نلاحظ أنَّ التطبيق “بايثون” يستخدم نسبة كبيرة من المعالج والذاكرة، وما توقعناه كان صحيحًا. أثناء تشغيل الأداة top اضغط على C لرؤية موقع الأمر كاملًا وربط كل عملية مع تطبيق محدد. تبيَّن أنَّ التطبيق “memeater.py” يستهلك أغلب الذاكرة. عندما تنفد الذاكرة نتيجة استهلاكها من أحد التطبيقات فإنَّ النظام ينهي (يقتل kill) هذا التطبيق أو العملية ويرسل خطأ نفاد الذاكرة (out-of-memory) اختصارًا (OOM). 10. netstat إنَّ وظيفة الأمر netstat هي عرض حالة الشبكة والمنافذ المستخدمة والاتصالات الواردة عبرها. هذه الأداء لا تكون مدمجة في لينكس لذا تحتاج إلى تثبيتها عبر الحزمة net-tools. من المحتمل أن تصادف خطأ -إن كنت مطورًا- يشير إلى أن المنفذ محجوز أو العنوان مستخدم حاليًا …إلخ. فيمكن استعمال الأمر netstat لتحليل وفحص الأعطال لمحاولة إصلاحها. يوضح المثال التالي أنَّ أباتشي يستخدم المنفذ 80 على الجهاز عند تنفيذ الأمر التالي: حيث يشير الخيار t إلىTCP والخيار u إلى UDP و l إلى listening (حالة الاستماع) و n إلى numeric. 11. ip address يعمل الأمر ip address على عرض الواجهات وعناوين IP لتطبيقات المضيف أو التحقق من عنوان IP للحاوية؛ إن لم يكن الأمر موجودًا أو لم يعمل فيمكنك تثبيته عبر الحزمة iproute2. إن كانت حاويتك متصلة مثلًا مع شبكتين فإنَّ الأمر ip address يبين الواجهة المتصلة مع كل شبكة؛ يمكن أيضًا استخدام هذا الأمر للحصول على عنوان IP للجهاز المضيف. يوضح المثال التالي أنَّ عنوان IP لحاوية الويب على الواجهة eth0 هو 172.17.0.2: 12. lsof يُستخدم الخيار lsof لسرد قائمة بالملفات المفتوحة (list open files) وربطها مع التطبيقات؛ قد لا يتواجد هذا الأمر في بعض توزيعات لينكس لذا ثبِّت الحزمة lsof. هنالك مقولة مشهورة وهي: "يُعامَل أي تفاعل مع النظام في لينكس على أنَّه ملف"، وبذلك إن كان هنالك تطبيق يكتب على ملف أو ينشئ اتصالًا على الشبكة فإنَّ الأمر lsof سيعتبره ملفًا. يُستخدم أيضًا هذا الأمر بصورة مشابهة للأمر netstat وذلك في عرض المنافذ المنصتة. إن أردت مثلًا التحقق من كون المنفذ 80 مستخدم حاليًا أو لا، فاستعمل الأمر lsof مع الخيار -i الذي يعطي قائمة بالملفات المفتوحة المرتبطة باتصال عبر الشبكة الموافقة لما بعد الخيار. توضح الصورة التالية خادوم أباتشي (httpd) يستمع على المنفذ 80؛ يمكن إعادة استخدام الأمر نفسه بإضافة الخيار -p مع رقم العملية لتحديد الاسم الأصلي للعملية ومكان وجودها على الجهاز وهذا مفيد خصوصًا مع أباتشي. 13. df يُستعمل الأمر df لإظهار مساحة القرص المستخدمة والمتوافرة لإصلاح المشاكل المرتبطة بالتخزين. عند تشغيل تطبيق على حاوية قد تظهر رسالة خطأ تشير إلى انخفاض المساحة المتوافرة عليها، وحينئذٍ يمكن استخدام الأمر df للتأكد من صحة هذا الخطأ وأنَّه حقًا لم تعد هنالك مساحة متوافرة إذ إن مدير النظام هو المسؤول عن إدارة وتحسين مساحة القرص. توضح الصورة مساحة القرص لجميع أنظمة الملفات الموجودة. الخيار -h (أو --human-readable) هو لإظهار الحجم بصيغة مقروءة. 14. du يُستخدم الأمر 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 نجد أنَّ المجلد anaconda هو الأكبر حجمًا من بين المجلدات الموجودة في /var/log. يمكن استخدام هذا الأمر بالتزامن مع الأمر df لمعرفة كيفيَّة توزيع المساحة المستخدمة على الملفات وما هي الملفات ذات الحجم الكبير. 15. id مهمَّة الأمر id هي عرض معلومات عن هوية مستخدم ومجموعة محدَّدة أو المستخدم الحالي والمجموعة التي ينتمي إليها. استخدمنا في المثال التالي الأداة Vagrant -وهي أداة للعمل ضمن بيئة افتراضيَّة- لاختبار التطبيق وعزله في بيئة تطويرية؛ بعد الدخول إلى صندوق Vagrant (البيئة الافتراضيَّة)، حاولنا تثبيت خادوم أباتشي ولكن النظام لم يسمح بتنفيذ الأمر لأنَّ تنفيذه يتطلب صلاحيات المستخدم الجذر (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 ولتنفيذ الأمر السابق يجب اختيار مستخدم ذو صلاحيات أعلى. 16. chmod قد تُصادف أحيانًا عند تشغيل تطبيق لأول مرة على حاسوبك رسالة الخطأ "الإذن مرفوض " (permission denied) لذا تأكد من الأذونات باستخدام الأمر 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) ضمن أذونات الملف وإن جربنا الآن تشغيله فلن تظهر رسالة الخطأ السابقة. 17. 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. 18. iptables إنَّ 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 من الواضح أنَّ الضبط الافتراضي للقواعد الثلاث الأولى هي "تجاهل" (drop) البيانات الشبكيَّة المرسلة والمستقبلة والموجَّهة، أما القواعد الأخرى فهي "السماح" (accept) بمرور البيانات عبر خادوم SSH و DNS. استشر في هذه الحالة مدير الأنظمة إذا كان هنالك حاجة لإضافة أو تعديل قاعدة للسماح بحركة البيانات للموقع السابق. إن كان المضيف الذي تستخدمه هو بيئة محليَّة أو للاختبار المحلي فاستخدم iptables للسماح بمرور البيانات غير الضارة. 19. sestatus توجد آلية للتحكم في الوصول على بعض توزيعات لينكس تدعى "التأمين المعزَّز في لينكس" (Security Enhanced Linux)، أو تدعى اختصارًا (SELinux)، ومفعلة عليه (الوضع enforcing)؛ توفِّر هذه الآلية إمكانية الوصول للعمليات المشغلة حاليًا بأدنى الصلاحيات إذ يحتمل أنَّ بعض تلك العمليات ضارٌ وبذلك تُمنع من الوصول إلى الملفات المهمَّة على النظام. قد يحتاج أحد التطبيقات أحيانًا الوصول إلى ملف ما ولكنَّه لا يستطيع فتظهر رسالة خطأ بذلك؛ يجب التأكد إن كان 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 دومًا على بيئتك التطويرية المحليَّة ليصبح أكثر تساهلًا. 20. history ختامًا، وبعد تنفيذ الكثير من الأوامر سواءً للتجريب أو لإصلاح بعض المشاكل، لابد أن نشير إلى الأمر history الذي لا تكاد تخلو صدفة (shell) منه؛ مهمَّة هذا الأمر هي طبع جميع الأوامر التي استخدمتها منذ بدء استخدامك للصدفة. تكمن فائدته بتسجيل الأوامر المستخدمة لإصلاح مشكلة ما وإعادة تذكرها أو تنفيذها. إن نفذنا هذا الأمر فستظهر جميع الأوامر التي تعلمتها وجربتها خلال هذه المقالة: $ history 1 clear 2 df -h 3 du إن أردت تنفيذ أحد هذه الأوامر السابقة فلن تحتاج لإعادة كتابته، فقط استخدم الرمز ! وأتبعه برقم الأمر الذي تود تنفيذه مجددًا. الخاتمة تعرَّفت على مجموعة من الأوامر الأساسيَّة التي ستزيد من خبرتك في تحليل الأعطال وإصلاحها، والتي يستخدمها الكثير من مديري الأنظمة لحل وإصلاح المشاكل التي تواجههم. التمرس على هذه الأوامر وفهمها يمنحك القدرة على التواصل مع مديري الأنظمة لحل المشاكل التي ستواجهك في المستقبل. ترجمة -وبتصرف- للمقال 20 Linux commands every sysadmin should know لصاحبه Rosemary Wang.