السلام عليكم ورحمة الله
منذ بدايتنا مع نظام DOS في التسعينيات كان النظام لايدعم تعدد المهام لذلك كان من الصعب جداً عمل برامج تعمل في الخلفية، لكن كانت هُناك طريقة تسمى TSR Terminate and Stay Resident. قرأت عنها في كتاب عن Turbo Pascal 6 لكن لا أذكر هل قُمت بتجربتها أم لا.
بعد التخرج من الجامعة احتجنا لتشغيل برامج في الخلفية، وببساطة كُنا نكتب برامج ليس لها أي واجهة، سواءً كانت رسومية أو نصية. والفكرة في مثل هذه البرامج هي أن تتعامل مع موارد الحاسوب اﻷخرى، مثل الملفات، قواعد البيانات، أو أن تتعامل مع بروتوكولات إتصالات الشبكات مثلاً.
بعد ظهور وندوز NT ظهرت طريقة جديدة لعمل مثل تلك البرامج تُسمى Windows NT services. وتمتاز عن البرامج التي ليس لها واجهة بأن نظام التشغيل يتكفل بتشغيلها أثناء بداية التشغيل، بل وتعمل حتى لو لم يتم الدخول بواسطة مستخدم على الجهاز، أي تعمل في وضع الـ Log-off . قُمنا بكتابة مثل هذه البرامج أيضاً بإستخدام دلفي، وهي تحتاج لوندوز NT حتى تعمل، أي لاتعمل في وندوز 95 أو وندوز 98، لكنها تعمل في وندوز 2000 و XP ومالحقه من نُسخ وندوز. ويتم التحكم في هذه البرامج بواسطة Control Panel/Services
أهداف البرامج التي تعمل في الخلفية هي:
- أن تعمل تلقائياً بمجرد إقلاع نظام التشغيل، ولاتحتاج للدخول بواسطة مستخدم لتعمل
- أن لاتتوقف عن العمل عند دخول مستخدم أو خروجه من سطح المكتب
- أن لا تتأثر ببيئة سطح المكتب الرسومية أو صلاحية المستخدم الحالي
- أن لا تكون عرضة للإغلاق أو العبث، حيث أن البرامج ذات الواجهة تكون معرضة لمثل ذلك
في بيئة لينكس لم أقم بعمل هذا النوع من البرامج،وكمثال للبرامج التي تعمل بهذه الطريقة في لينكس ووندوز: Apache, MySQL, FireBird وغيرها من البرامج الكثيرة. مع أني احتجت لها، وحاولت مرة بإستخدام لازاراس ولم أنجح، لكن اليوم بفضل الله وجدت طريقة بسيطة، ثم قُمت بتطويرها. وقد جربتها مع برامج لازاراس وجافا بنجاح. وكانت بداية الخيط في تعليق بهذه الصفحة. وكانت الكلمة المفتاحية هي استخدام الرمز & بعد نهاية أي برنامج نُريد تشغيله في الخلفية. فقط نقوم بكتابة اﻷمر ثم هذه العلامة في النهاية :
vi & [1] 5610 motaz@motaz-computer:~$
في هذه الحالة يعمل البرنامج في الخلفية ويعطيك نظام التشغيل رقم الـ process وهو 6510 في هذا المثال للرجوع له لاحقاً، لإغلاقه أو أعادة تنشيطه في الواجهة. فقمت بعمل برنامج بسيط ثم تشغيله بهذه الطريقة ثم إغلاق نافذة سطر اﻷوامر terminal لأعود إليها وأجد أن البرنامج مازال يعمل في الخلفية.
وهذا هو التعليق الذي استفدت منه كثيراً في بداية كتابة مثل هذه البرامج:
Basically, you need to create a little shell script in /etc/init.d and make symlinks to /etc/rc2.d and /etc/rc5.d. The contents could be like this:
#!/bin/sh if [ "$1" = start ] ; then cd /put_your_workdir_here /usr/bin/java -jar SyslogAgent_01.jar 192.168.2.154 1998 D:/apachelog.log ApacheLog 13 & fi
Notice that you start your program in background (& at the end of the commandline)
فقمت بعمل برنامج اسمه mybackground بواسطة فري باسكال/لازاراس ليس فيه أي مخرجات ثم عمل script له في الدليل
/etc/init.d/
وفي هذا الدليل يوجد إسكريبت لكل برامج يعمل في الخلفية ويتم تشغيلها قبل الدخول على سطح المكتب. قُمت بتسمية الملف mybg
هذا هو البرنامج المكتوب بواسطة لاازاراس:
program mybackground; {$mode objfpc}{$H+} uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes, sysutils { you can add units after this }; var StartTime: TDateTime; F: TextFile; begin StartTime:= Now; AssignFile(F, 'log.txt'); repeat if FileExists('log.txt') then Append(F) else Rewrite(F); Writeln(F, DateTimeToStr(Now)); CloseFile(F); Sleep(5000); until StartTime + EncodeTime(0, 5, 0, 0) < Now; end.
وهو ببساطة يقوم بكتابة التاريخ والوقت في ملف اسمه log.txt كل خمس ثواني لمدة خمس دقائق ثم يتوقف. طبعاً البرامج الحقيقية لهذا النوع يجب أن تظل تعمل بدون توقف، وهذه هي إحدى أهدافها.
ثم كتبت هذا الكود في الملف
/etc/init.d/mybg
#!/bin/sh if [ "$1" = start ] ; then cd /home/motaz/projects/background ./mybackground & fi
ثم نُعطى الملف صلاحية التنفيذ +x
ويُمكن تشغيل هذا البرنامج بواسطة اﻷمر التالي:
sudo /etc/init.d/mybg start
ثم كتبت برنامج آخر بواسطة جافا سميته firstbg وكتبت له هذا الـ script في الدليل /etc/init.d
#!/bin/sh if [ "$1" = start ] ; then cd /home/motaz/NetBeansProjects/firstbg/dist java -jar firstbg.jar & fi
بعد ذلك قُمت بتطوير الإسكريبت لإضافة أمر لإيقاف البرنامج stop، ولمعرفة حالته status ولمنع تشغيله أكثر من مرة، وكان ذلك بواسطة عدد من التجارب على لغة shell script:
#!/bin/sh if [ "$1" = start ] ; then count=$(ps -ef | grep mybackground | wc -lc | awk '{print $1}') if [ $count -lt 2 ] ; then cd /home/motaz/projects/background ./mybackground & echo "started" else echo "Already running" fi fi if [ "$1" = status ] ; then count=$(ps -ef | grep mybackground | wc -lc | awk '{print $1}') if [ $count -lt 2 ] ; then echo "Stopped" else echo "Running..." fi fi if [ "$1" = stop ] ; then count=$(ps -ef | grep mybackground | wc -lc | awk '{print $1}') if [ $count -gt 1 ] ; then psid=$(ps -ef | grep mybackground | head -n1 | awk '{print $2}') kill -9 $psid echo "Stopped" else echo "Not Running" fi fi
نظرياً يمكن عمل برامج تعمل في الخلفية في نظام لينكس بأي لغة برمجة تستطيع تشغيل حلقة إلى مالانهاية infinite loop، أما لغات الـ scripting فهي لاتصلح لهذا النوع. ويجب التفرقة بين البرامج التي تعمل في الخلفية مع برامج الويب مثلاً المكتوبة بلغة php فهي ليست من هذا النوع، حيث أن حياتها قصيرة، يتم تشغيلها لتلبية طلب مستخدم ثم تزول من الذاكرة، أما البرامج التي تعمل في الخلفية فلها دورة حياة طويلة تستمر مادام الجهاز مفتوح، بمعني يُمكن أن يعمل البرنامج شهوراً متواصلة دون توقف، لذلك يجب أن تتم كتابته بواسطة مبرمج محترف حتى لا يتسبب في ضرر بالنسبة للحواسيب او البرامج اﻷخرى التي تعمل فيها.
تحديث (٦ ديسمبر ٢٠١٣)
قُمت بتثبيت برنامج يعمل في الخلفية اليوم، واتبعت نفس الخطوات، لكن عند إعادة تشغيل الجهاز لم يعمل البرنامج تلقائياً. فعندما بحثت قُمت تنفيذ هذا الأمر والذي قام بتفعيل التشغيل التلقائي للبرنامج الذي يعمل في الخلفية
sudo update-rc.d your-service defaults
خاصية الTSR او الإنتهاء والبقاء في الذاكرة كانت من الخصائص القوية في نظام الدوس وهي خاصية لا غنى عنها لأي كاتب فيروسات مخصصة لنظام الدوس فهي تعطيك امكانية انتحال اي من وظائف نظام التشغيل مثل الوصول الى القرص الصلب او الشاشة او لوحة المفاتيح،وقد كنت اعشق استخدامها في منتصف التسعينات وقد فرحت جدا بإكتشافها في وقت كان من الصعب فيه الحصول على مثل تلك المعلومات التقنية ،حيث لم تكن شبكة الإنترنت متوفرة في ذلك الوقت،ولكن اصابني الإحباط بعد نهاية عصر الدوس واليأس من البدء من جديد ومعرفة كيف يمكن تحقيق ذلك على الويندوز 95 ومن بعده اللنكس حيث لم يسمح لي الوندوز 95 من تشغيل تلك الخاصية رغم انه كان ما يزال يعتمد على الدوس في بدء تشغيله وليس مثل بقية انظمة التشغيل مثل الوندوز xp وما بعده
احد البرامج المكتوب بواسطة تقنية TSR في نظام دوز هو مضاد للفيروسات، أظنه كان من ميكروسوفت، كان يُراقب الملفات التنفيذية، فإذا حدث لها تغيير يقوم بإصدار صوت مزعج. وكان يحدث ذلك عند إعادة ترجمة برامج توربو باسكال وتروبو سي. لكن هذه الخاصية كُنا نقوم بتعطيلها بسبب هذا اﻹزعاج
فعلا لا انسى ذلك البرنامج المزعج كان اسمع MSAV فلي معه ذكريات جميلة
هل يمكن استخدام نفس الطريقة على الأندرويد وهل يوجد لديه /etc/init.d/ ، اعتقد اذا كان ذلك ممكنا فقد يكون له تطبيقات مفيدة بما أن أجهزة الأندرويد رخيصة ويمكن تخصصيها لتطبيق واحد فقط يبدأ مع بداية التشغيل ولا يربك المستخدم ببقية التطبيقات والأدوات والإعدادات
ربما، بسبب أن نواة أندرويد مشتقة عن نواة لينكس. لكن ربما الطريقة تختلف، وذلك بإعتباره نظام تشغيل مستقل يُمكن أن تكون لديه طريقة مختلفة لآلية تهيئة البرامج التي تعمل في الخلفية
نفس الذكريات اشاركها مع “محمد الشمباتي”
اول برنامج كتبته على التوربو باسكال على PC كان TSR يقوم بعرض نص طويل ضمن مجال10 أحرف على الزاوية يدور طوال الوقت.
تعملت الـ TSR في كومبيوتر سنكلير المعالج Z80 و خاصية مقاطعة هاردوير تتم كل فترة زمنية أو بناءا على أمر هاردور، و هو مازال مستخدما إلى الأن و لكن من النظام و ليس من قبل البرامج، و خاصة للعتاد.
كان البرنامج الذي يستخدم المقاطعة هو برنامج شطرنج Chess Master و يستخدمه لإظهار التوقيت للاعب، قمت بقراءة برنامج الشطرج بلغة الآلة Z80 و اكتشتفها، فكان اول برنامج اصنعه على الـ PC و كانت اخر تعليمة كنت أجهلها في Z80
اجمل ذكرى لي مع برامج ال TSR كانت في الجامعة عندما عكفت في المنزل لكتابة برنامج بلغة الأسمبلي يقوم بإنتحال وظيفة لوحة المفاتيح وانتظار محاولات الدخول الى شبكة الجامعة لتسجيل معلومات المستخدمين وقمت بزرعه في جميع اجهزة الجامعة ،فحصلت على جميع كلمات المرور بما فيها كلمة مرور السوبرفايزر،وكان ذلك قانونيا لأنه كان استجابة لتحدي من رئيس القسم أن لا أحد يستطيع اختراق حسابه!