النقاط الرئيسية
- لا يعمل أمر تسجيل الخروج في Linux في البرامج النصية لأنها تعمل في واجهات غير تسجيل الدخول.
- في غلاف تسجيل الدخول في وحدة التحكم، يمكنك استخدام الأمر exec لتشغيل البرنامج النصي وسيتم تسجيل خروجك عند انتهائه.
- تتضمن الطرق البديلة استخدام المصدر أو إضافة أمر تسجيل الخروج إلى سطر الأوامر.
لا يعمل أمر تسجيل الخروج في Linux داخل نصوص Bash. نادرًا ما يحدث هذا، ولكن في بعض الأحيان قد تحتاج إلى هذه الوظيفة. فيما يلي ثلاث طرق لتجنب المشكلة وتسجيل الخروج من نص برمجي.
لماذا لا يعمل تسجيل الخروج في البرامج النصية
هناك أصداف تسجيل دخول وأصداف غير تسجيل دخول. أول صدف يتم إنشاؤه عند تسجيل الدخول هو صدف تسجيل دخول. كل الأصداف الأخرى ليست أصداف تسجيل دخول. تنبع الاختلافات بين النوعين من الأصداف من ملفات النظام المختلفة التي تقرأها الصدف عند إنشائها.
من الواضح أنه لا يمكنك تسجيل الخروج من واجهة غير قابلة لتسجيل الدخول. إذا لم تكن الواجهة تحتوي على مفهوم تسجيل الدخول، فلن تتمكن من تسجيل خروجك.
لا يتم تشغيل نصوص shell في shell التي تم تشغيلها منه. يتم إنشاء shell جديد لتشغيلها فيه. حتى إذا تم تشغيلها من shell تسجيل دخول، فلن يتم تشغيلها في shell تسجيل دخول.
يمكننا أن نرى ذلك بسهولة تامة. هذا هو موجه تسجيل الدخول لجهاز كمبيوتر يعمل بنظام Arch Linux، دون تثبيت أي بيئة سطح مكتب رسومية. إنه يستخدم غلاف Bash. لقد قمت بتسجيل الدخول، وأنا على وشك الضغط على Enter في أمر تسجيل الخروج.
logout
كما تتوقع، تم إعادتي إلى صفحة تسجيل الدخول.
من الواضح أن واجهة المستخدم التي أستخدمها هي واجهة تسجيل دخول. فلنسجل الدخول مرة أخرى ونتحقق من محتويات البرنامج النصي المسمى lo.sh. ثم سنشغله.
cat lo.sh
./lo.sh
يشكو Bash من عدم قدرتنا على استخدام تسجيل الخروج في غلاف غير مخصص لتسجيل الدخول. ورغم أن البرنامج النصي الخاص بنا تم تشغيله بالتأكيد من غلاف مخصص لتسجيل الدخول، إلا أنه لا يعمل. لم يتم تسجيل خروجنا.
ولن يعمل أيضًا في نافذة محاكي المحطة الطرفية على جهاز كمبيوتر به بيئة سطح مكتب رسومية. في هذه الحالة، يكون الأمر متعلقًا بنظام التشغيل Ubuntu مع سطح مكتب GNOME.
logout
لقد ذكرت أنك تمتلك واجهة تسجيل دخول واحدة فقط. ولكن هذا ليس صحيحًا تمامًا. فهناك سيناريوهات قد يكون لديك فيها أكثر من واجهة تسجيل دخول تعمل على جهاز الكمبيوتر الخاص بك، ولكنك تمتلك واجهة تسجيل دخول واحدة فقط لكل مثيل مستخدم.
يحتاج كل مستخدم إلى واجهة تسجيل دخول خاصة به، حتى يتمكن من تسجيل الدخول والخروج. ومن الممكن تسجيل الدخول إلى نفس الكمبيوتر أكثر من مرة، بنفس المستخدم. إذا قمت بإعداد SSH على الكمبيوتر الخاص بك لدعم الوصول عن بعد، فيمكنك تسجيل الدخول مرة أخرى عبر SSH، إلى الكمبيوتر المحلي الخاص بك، من خلال نافذة طرفية.
ssh dave@localhost
who
logout
who
بمجرد تسجيل الدخول، نقوم بتشغيل أمر who لإدراج المستخدمين الحاليين، ثم تسجيل الخروج وتشغيل who مرة أخرى. يمكننا أن نرى أنه كان لدينا مستخدم إضافي مؤقتًا. هذا المستخدم لديه غلاف تسجيل دخول خاص به. لكن هذا لا يساعدنا في السيناريو الخاص بنا. إنه المستخدم الوحيد الذي يمكنه الوصول إلى هذا الغلاف، وسيشاهد نفس السلوك الذي رأيناه للتو.
كيفية تسجيل الخروج باستخدام exec
لذا: يجب استخدام تسجيل الخروج في غلاف تسجيل الدخول، ولكن لن يتم تشغيل البرنامج النصي الخاص بنا في غلاف تسجيل الدخول حتى إذا تم تشغيله من غلاف تسجيل دخول.
ما يمكننا فعله هو تشغيل البرنامج النصي الخاص بنا باستخدام الأمر exec. لا يتبع هذا العملية العادية لإنشاء غلاف لتشغيل البرنامج النصي فيه. إنه يستبدل الغلاف الحالي بالأمر الذي يقوم الأمر exec بتشغيله. يتم تجاهل الغلاف. عندما ينتهي الأمر، لا يمكن الرجوع إلى الغلاف غير الموجود الآن. إذا قمنا بذلك من غلاف تسجيل الدخول، فسيتم تسجيل خروجنا.
نحن بحاجة إلى نص برمجي للتجربة. انسخ هذا النص البرمجي البسيط إلى محرر النصوص المفضل لديك، ثم احفظه باسم “lo.sh”.
#!/bin/bashlogout
سنستخدم chmod لجعله قابلاً للتنفيذ.
chmod +x lo.sh
يفشل البرنامج النصي مع رسالة الخطأ المألوفة الآن:
./lo.sh
إذا قمنا بتشغيله باستخدام exec، سيتم إغلاق نافذة المحطة الطرفية عندما يتوقف تشغيل البرنامج النصي.
exec ./lo.sh
بالطبع، على جهاز الكمبيوتر Arch الذي يعمل بوحدة التحكم فقط، لا نستخدم محاكي المحطة الطرفية. يقوم exec باستبدال غلاف تسجيل الدخول الخاص بنا بالنص البرمجي.
عندما ينتهي البرنامج النصي، تظهر لنا رسالة تسجيل دخول جديدة. لذا، فهو يعمل لتسجيل الدخول إلى وحدة التحكم على أجهزة كمبيوتر Linux بدون بيئة سطح مكتب رسومية مثبتة. هل يساعدنا ذلك على جهاز الكمبيوتر Ubuntu الذي يعمل بنظام GNOME؟
نعم، هذا صحيح. في GNOME، يمكننا الضغط على Ctrl+Alt+FnKey لفتح نفس النوع من وحدة التحكم في تسجيل الدخول على الشاشة الكاملة. يمكن أن يكون مفتاح FnKey واحدًا من F3 إلى F6.
يمكننا تسجيل الدخول واستخدام نفس الأمر الذي استخدمناه على جهاز الكمبيوتر Arch الخاص بنا.
exec lo.sh
لقد قمنا بتسجيل الخروج، وتمت إعادتنا إلى موجه تسجيل الدخول بوحدة التحكم. يؤدي الضغط على Ctrl+Alt+F1 إلى إعادتك إلى جلسة GNOME الخاصة بك. ستحتاج إلى إدخال كلمة المرور لاستعادة الوصول.
لاحظ أنك ستعود إلى جلسة GNOME الخاصة بك بالطريقة التي كانت عليها قبل الضغط على Ctrl+Alt+F3. لم يتم تسجيل خروج جلسة GNOME الخاصة بك، ولكنها محمية بكلمة مرور.
إذا كنت لا تريد أن يظل مستخدم جلسة GNOME الخاص بك مسجلاً للدخول، فقم بتسجيل خروجه قبل تشغيل البرنامج النصي الخاص بك. يمكنك الضغط على Ctrl+Alt+F3 على شاشة تسجيل الدخول في Ubuntu، وتسجيل الدخول في وحدة التحكم، وتشغيل البرنامج النصي الخاص بك.
نقطتان. عندما تستخدم exec بهذه الطريقة، فإن أمر تسجيل الخروج في البرنامج النصي يكون غير ضروري. إن حقيقة أن البرنامج النصي ينتهي دون وجود غلاف للعودة إليه هي التي تؤدي فعليًا إلى تسجيل خروجك.
يمكنك استخدام الأمر exit بدلاً من logout، أو عدم استخدام أي من الأمرين على الإطلاق. بمجرد انتهاء البرنامج النصي، يتم تسجيل خروجك. إذا كان لديك فروع تنفيذ في البرنامج النصي الخاص بك، ويمكن أن ينتهي في أماكن مختلفة، فيمكنك استخدام exit لإنهاء كل مسار ممكن للتنفيذ.
هناك مشكلة أخرى، نظرًا لأنك لا تقوم بتنفيذ البرنامج النصي الخاص بك داخل غلاف، فلن تتمكن من الوصول إلى ميزات الغلاف مثل توسيع الأحرف البدل، ولا الأسماء المستعارة ووظائف الغلاف. إذا كان البرنامج النصي الخاص بك يحتاج إلى هذه الميزات، فيمكنك استخدام إحدى التقنيات الأخرى الموضحة أدناه.
كيفية تسجيل الخروج باستخدام المصدر
يؤدي استخدام أمر مصدر Linux إلى تفسير الأوامر الموجودة داخل البرنامج النصي الخاص بك دون تشغيل البرنامج النصي في shell. يتم تفسير الأوامر بواسطة shell الحالي.
افتح نافذة وحدة التحكم كما هو موضح أعلاه، باستخدام Ctrl+Alt+F3، واستخدم الأمر source لتفسير الأوامر الموجودة في البرنامج النصي الخاص بك.
source ./lo.sh
يمكنك استخدام كلمة المصدر، أو النقطة.
. ./lo.sh
باستخدام هذه التقنية، ستحتاج إلى استخدام خيار الخروج أو تسجيل الخروج من البرنامج النصي. لن يؤدي إنهاء البرنامج النصي من تلقاء نفسه إلى تسجيل خروجك.
كيفية تسجيل الخروج باستخدام دالة Bash
توجد طريقة لتشغيل أي نص برمجي وتسجيل الخروج منه عند الانتهاء منه، دون استدعاء تسجيل الخروج أو الخروج من النص البرمجي نفسه. احفظ هذا النص البرمجي باسم simple.sh.
#!/bin/bashecho "This script doesn't call any other commands."
جعله قابلاً للتنفيذ عن طريق الكتابة:
chmod +x simple.sh
في شاشة وحدة التحكم في تسجيل الدخول، أضف أمر تسجيل الخروج بعد اسم البرنامج النصي. افصل اسم البرنامج النصي عن أمر تسجيل الخروج بفاصلة منقوطة.
./simple.sh; logout
عندما ينتهي البرنامج النصي الخاص بنا، سيتم تسجيل خروجنا.
إذا كنت تفعل هذا بشكل متكرر، فسيكون من المناسب إنشاء وظيفة Bash صغيرة مثل هذه.
run-logout () {
$1; logout
}
يمكنك استدعاء هذه الوظيفة وتمرير اسم البرنامج النصي إليها. عندما تفعل ذلك في وحدة التحكم في تسجيل الدخول، سيتم تسجيل خروجك عند انتهاء البرنامج النصي.
run-logout simple.sh
ملخص سريع
إذا كنت تريد تشغيل البرنامج النصي حتى اكتماله في غيابك، وتسجيل خروج المستخدم عند اكتماله حتى لا يكون هناك مستخدم مسجل الدخول على الإطلاق، فاتبع الخطوات التالية.
- تسجيل خروج كافة المستخدمين من الكمبيوتر.
- في شاشة تسجيل الدخول إلى GNOME، اضغط على Ctrl+Alt+F3 لفتح نافذة وحدة التحكم في تسجيل الدخول.
- تسجيل الدخول.
- قم بتشغيل البرنامج النصي الخاص بك باستخدام إحدى الطرق الثلاث الموضحة أعلاه.