كتابة برامج لنظام لينكس تعمل في الخلفية

السلام عليكم ورحمة الله

منذ بدايتنا مع نظام DOS في التسعينيات كان النظام لايدعم تعدد المهام لذلك كان من الصعب جداً عمل برامج تعمل في الخلفية، لكن كانت هُناك طريقة تسمى TSR Terminate and Stay Resident. قرأت عنها في كتاب عن Turbo Pascal 6 لكن لا أذكر هل قُمت بتجربتها أم لا.

بعد التخرج من الجامعة احتجنا لتشغيل برامج في الخلفية، وببساطة كُنا نكتب برامج ليس لها أي واجهة، سواءً كانت رسومية أو نصية. والفكرة في مثل هذه البرامج هي أن تتعامل مع موارد الحاسوب اﻷخرى، مثل الملفات، قواعد البيانات، أو أن تتعامل مع بروتوكولات إتصالات الشبكات مثلاً.

بعد ظهور وندوز NT ظهرت طريقة جديدة لعمل مثل تلك البرامج تُسمى Windows NT services. وتمتاز عن البرامج التي ليس لها واجهة بأن نظام التشغيل يتكفل بتشغيلها أثناء بداية التشغيل، بل وتعمل حتى لو لم يتم الدخول بواسطة مستخدم على الجهاز، أي تعمل في وضع الـ Log-off . قُمنا بكتابة مثل هذه البرامج أيضاً بإستخدام دلفي، وهي تحتاج لوندوز NT حتى تعمل، أي لاتعمل في وندوز 95 أو وندوز 98، لكنها تعمل في وندوز 2000 و XP ومالحقه من نُسخ وندوز. ويتم التحكم في هذه البرامج بواسطة Control Panel/Services

أهداف البرامج التي تعمل في الخلفية هي:

  1. أن تعمل تلقائياً بمجرد إقلاع نظام التشغيل، ولاتحتاج للدخول بواسطة مستخدم لتعمل
  2. أن لاتتوقف عن العمل عند دخول مستخدم أو خروجه من سطح المكتب
  3. أن لا تتأثر ببيئة سطح المكتب الرسومية أو صلاحية المستخدم الحالي
  4. أن لا تكون عرضة للإغلاق أو العبث، حيث أن البرامج ذات الواجهة تكون معرضة لمثل ذلك

في بيئة لينكس لم أقم بعمل هذا النوع من البرامج،وكمثال للبرامج التي تعمل بهذه الطريقة في لينكس ووندوز: 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
Advertisements

7 أفكار على ”كتابة برامج لنظام لينكس تعمل في الخلفية

  1. خاصية الTSR او الإنتهاء والبقاء في الذاكرة كانت من الخصائص القوية في نظام الدوس وهي خاصية لا غنى عنها لأي كاتب فيروسات مخصصة لنظام الدوس فهي تعطيك امكانية انتحال اي من وظائف نظام التشغيل مثل الوصول الى القرص الصلب او الشاشة او لوحة المفاتيح،وقد كنت اعشق استخدامها في منتصف التسعينات وقد فرحت جدا بإكتشافها في وقت كان من الصعب فيه الحصول على مثل تلك المعلومات التقنية ،حيث لم تكن شبكة الإنترنت متوفرة في ذلك الوقت،ولكن اصابني الإحباط بعد نهاية عصر الدوس واليأس من البدء من جديد ومعرفة كيف يمكن تحقيق ذلك على الويندوز 95 ومن بعده اللنكس حيث لم يسمح لي الوندوز 95 من تشغيل تلك الخاصية رغم انه كان ما يزال يعتمد على الدوس في بدء تشغيله وليس مثل بقية انظمة التشغيل مثل الوندوز xp وما بعده

  2. احد البرامج المكتوب بواسطة تقنية TSR في نظام دوز هو مضاد للفيروسات، أظنه كان من ميكروسوفت، كان يُراقب الملفات التنفيذية، فإذا حدث لها تغيير يقوم بإصدار صوت مزعج. وكان يحدث ذلك عند إعادة ترجمة برامج توربو باسكال وتروبو سي. لكن هذه الخاصية كُنا نقوم بتعطيلها بسبب هذا اﻹزعاج

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

  4. ربما، بسبب أن نواة أندرويد مشتقة عن نواة لينكس. لكن ربما الطريقة تختلف، وذلك بإعتباره نظام تشغيل مستقل يُمكن أن تكون لديه طريقة مختلفة لآلية تهيئة البرامج التي تعمل في الخلفية

  5. نفس الذكريات اشاركها مع “محمد الشمباتي”
    اول برنامج كتبته على التوربو باسكال على PC كان TSR يقوم بعرض نص طويل ضمن مجال10 أحرف على الزاوية يدور طوال الوقت.
    تعملت الـ TSR في كومبيوتر سنكلير المعالج Z80 و خاصية مقاطعة هاردوير تتم كل فترة زمنية أو بناءا على أمر هاردور، و هو مازال مستخدما إلى الأن و لكن من النظام و ليس من قبل البرامج، و خاصة للعتاد.
    كان البرنامج الذي يستخدم المقاطعة هو برنامج شطرنج Chess Master و يستخدمه لإظهار التوقيت للاعب، قمت بقراءة برنامج الشطرج بلغة الآلة Z80 و اكتشتفها، فكان اول برنامج اصنعه على الـ PC و كانت اخر تعليمة كنت أجهلها في Z80

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

اترك رد

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s