[{"data":1,"prerenderedAt":191},["ShallowReactive",2],{"seo-verification":3,"blog-cron-مقابل-systemd-timers-أتمتة-vps-linux-ar":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"id":7,"slug":8,"slugs":9,"title":12,"excerpt":13,"readTime":14,"views":15,"isPinned":16,"publishedAt":17,"category":18,"categories":23,"featuredImage":25,"bgImage":26,"posterImage":27,"relatedSolution":25,"intro":28,"sections":29,"ctaTitle":139,"ctaBody":140,"ctaButton":141,"ctaUrl":142,"relatedPosts":143},230,"cron-مقابل-systemd-timers-أتمتة-vps-linux",{"fr":10,"en":11,"ar":8},"cron-systemd-timers-automatisation-vps","cron-vs-systemd-timers-automate-your-linux-vps","cron مقابل systemd timers: أتمتة VPS Linux","مقارنة عملية بين cron وsystemd timers: الصياغة والسجلات والهجرة واستكشاف الأخطاء للمهام المتكررة على VPS Linux.",10,1,false,"2026-08-06T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":21},2,"الأتمتة","automatisation","bg-brand-action\u002F10 text-brand-action",[24],{"id":19,"name":20,"slug":21,"color":22,"icon":21},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fcron-systemd-timers-automatisation-vps-poster.svg","على أي ‪VPS‬ يعمل بـ‪Linux‬، الأتمتة ضرورة لا رفاهية: النسخ الاحتياطية الليلية، وتجديد شهادات ‪TLS‬، وتنظيف السجلات، وفحوصات الصحة — هذه المهام إما تعمل وحدها أو لا تعمل أبداً. ‪cron‬ يهيمن منذ عقود، لكن ‪systemd timers‬ تقدم تكاملاً أعمق مع مدير الخدمات.",[30,34,44,47,50,90,93,96,115,130,133,136],{"type":31,"title":32,"body":33},"h2","لماذا أتمتة المهام على VPS؟","‪VPS‬ هو خادم يعمل باستمرار، غالباً دون إشراف بشري مباشر. لهذا السبب بالذات تُعدّ أتمتة المهام المتكررة أمراً جوهرياً: لن يكون هناك أحد في الساعة الثالثة صباحاً لتشغيل النسخ الاحتياطي أو تجديد شهادة ‪Let's Encrypt‬. مهمة منسية قد تعني فقدان بيانات، أو شهادة منتهية الصلاحية، أو قرصاً ممتلئاً. الأداتان الرئيسيتان المتاحتان على ‪Linux‬ — ‪cron‬ و‪systemd timers‬ — تتيحان جدولة هذه العمليات بصورة موثوقة.",{"type":35,"title":36,"items":37},"ul","حالات الاستخدام الشائعة على VPS",[38,39,40,41,42,43],"**النسخ الاحتياطية** — تفريغ ‪MySQL‬ أو ‪PostgreSQL‬، أرشفة الملفات إلى تخزين بعيد","**تجديد شهادات TLS** — `certbot renew` أو `acme‎.sh --cron` مجدولان مرتين يومياً","**تدوير السجلات وتنظيفها** — حذف الملفات الأقدم من 30 يوماً، ضغط أسبوعي","**فحوصات الصحة** — التحقق من أن الخدمة تستمع، إعادة التشغيل التلقائي عند الحاجة","**مزامنة البيانات** — `rsync` إلى عقدة ثانية، تحديث ذاكرة التخزين المؤقت","**تنظيف البيئات** — حذف الجلسات المنتهية، تفريغ المجلدات المؤقتة",{"type":31,"title":45,"body":46},"cron: مراجعة سريعة","‪cron‬ موجود في كل توزيعات ‪Linux‬ تقريباً. لجدولة مهمة، يمكنك تحرير ‪crontab‬ المستخدم الحالي بالأمر `crontab -e`. تعتمد الصياغة على خمسة حقول مفصولة بمسافات: الدقيقة، الساعة، اليوم من الشهر، الشهر، يوم الأسبوع، تليها الأمر. لا يحتفظ ‪cron‬ بأي سجل أصلي للتنفيذات السابقة ولا يتعامل مع المهام الفائتة إذا كانت الآلة مغلقة.",{"type":31,"title":48,"body":49},"systemd timers: مقدمة","‪systemd timer‬ هو زوج من ملفَي وحدة: ملف ‪‎.service‬ يصف ما يجب تنفيذه، وملف ‪‎.timer‬ يصف موعد تشغيله. يُفعَّل الـ‪timer‬ بالأمر `systemctl enable --now myservice‎.timer` ويُدار بواسطة مدير الخدمات. توجيه `OnCalendar=` يقبل صياغة غنية: `daily`، أو `Mon *-*-* 03:00:00`. تمر جميع المخرجات عبر ‪journald‬. الأمر `systemctl list-timers` يُظهر قائمة بجميع الـ‪timers‬ النشطة مع موعدها التالي وآخر تفعيل.",{"type":51,"title":52,"headers":53,"rows":57},"comparison","cron مقابل systemd timers: جدول مقارنة",[54,55,56],"المعيار","cron","systemd timer",[58,62,66,70,74,78,82,86],[59,60,61],"صياغة الجدولة","خمسة حقول `* * * * *`","`OnCalendar=` مقروء (`daily`، `Mon 03:00`)",[63,64,65],"السجلات","بريد إلكتروني أو إعادة توجيه يدوية","‪journald‬ أصلي، `journalctl -u`",[67,68,69],"المهام الفائتة (الآلة مغلقة)","مفقودة (إلا مع `anacron`)","`Persistent=true` يعيد التشغيل بعد إعادة التشغيل",[71,72,73],"التبعيات بين الخدمات","لا يوجد","`After=`، `Requires=`، `Wants=`",[75,76,77],"العزل وحدود الموارد","يرث بيئة الـ‪shell‬","‪Cgroups‬، `MemoryMax=`، `CPUQuota=`",[79,80,81],"التشغيل كمستخدم محدد","حقل المستخدم في `\u002Fetc\u002Fcron.d\u002F`","`User=` و`Group=` في ملف ‪‎.service‬",[83,84,85],"تشخيص الأخطاء","صعب بدون سجلات","`systemctl status`، `journalctl -xe`",[87,88,89],"التوفر","جميع أنظمة ‪Unix‬","الأنظمة مع ‪systemd‬ (‪Debian‬، ‪Ubuntu‬، ‪RHEL‬…)",{"type":31,"title":91,"body":92},"متى تبقي على cron؟","يبقى ‪cron‬ الخيار الصحيح في عدة حالات. على الأنظمة القديمة أو المُخففة بدون ‪systemd‬ — بعض الحاويات، و‪BSD‬، وصور ‪Alpine‬ — يكون ‪cron‬ في الغالب الأداة الوحيدة المتاحة. في البيئات متعددة المستخدمين حيث يدير كل مستخدم مهامه الخاصة عبر `crontab -e`، يكون ‪cron‬ أبسط للتفويض. المعيار الحاسم هو الحاجة إلى سجلات أو تبعيات أو قيود على الموارد.",{"type":31,"title":94,"body":95},"متى تنتقل إلى systemd timers؟","تصبح ‪systemd timers‬ الخيار الواضح حين تتجاوز المهمة نطاق أمر بسيط ومعزول. تحتاج ‪journald‬ لتتبع كل تنفيذ ومخرجاته ورمز إرجاعه دون تمديد يدوي؟ ‪systemd timers‬. يجب أن يعمل سكريبت النسخ الاحتياطي فقط بعد أن يصبح ‪PostgreSQL‬ جاهزاً (`After=postgresql‎.service`)؟ ‪systemd timers‬.",{"type":97,"title":98,"steps":99},"steps","إنشاء systemd timer من الصفر (مثال: نسخ احتياطي يومي)",[100,103,106,109,112],{"title":101,"body":102},"إنشاء ملف الخدمة","افتح `\u002Fetc\u002Fsystemd\u002Fsystem\u002Fbackup‎.service` وأدخل: `[Unit]`، `Description=Daily PostgreSQL backup`، `After=postgresql‎.service`، ثم `[Service]`، `Type=oneshot`، `User=postgres`، `ExecStart=\u002Fusr\u002Flocal\u002Fbin\u002Fbackup‎.sh`.",{"title":104,"body":105},"إنشاء ملف الـ timer","أنشئ `\u002Fetc\u002Fsystemd\u002Fsystem\u002Fbackup‎.timer` بـ: `[Unit]`، ثم `[Timer]`، `OnCalendar=*-*-* 03:00:00`، `Persistent=true`، و`[Install]`، `WantedBy=timers‎.target`.",{"title":107,"body":108},"إعادة تحميل systemd وتفعيل الـ timer","نفِّذ `systemctl daemon-reload` حتى يأخذ ‪systemd‬ الملفات الجديدة بالاعتبار، ثم `systemctl enable --now backup‎.timer` لتفعيل الـ‪timer‬ وتشغيله فوراً.",{"title":110,"body":111},"التحقق من الـ timer","اكتب `systemctl list-timers --all` لرؤية الـ‪timer‬ في القائمة. استخدم `systemctl status backup‎.timer` لحالة الـ‪timer‬.",{"title":113,"body":114},"قراءة السجلات","اطّلع على كل مخرجات الخدمة بـ `journalctl -u backup‎.service` للتاريخ الكامل، أو `journalctl -u backup‎.service -n 50 --since today` لآخر 50 سطراً اليوم.",{"type":97,"title":116,"steps":117},"هجرة مهمة cron موجودة إلى systemd",[118,121,124,127],{"title":119,"body":120},"تحديد مهمة cron المراد هجرتها","أدرج ‪crontabs‬ بـ `crontab -l` (المستخدم الحالي) و`cat \u002Fetc\u002Fcron.d\u002F*` (النظام). لاحظ الأمر الدقيق، ومستخدم التنفيذ، والجدولة ذات الخمسة حقول.",{"title":122,"body":123},"ترجمة الجدولة إلى OnCalendar","صيغة `OnCalendar=` في ‪systemd‬ تُكتب `DayOfWeek Year-Month-Day Hour:Minute:Second`. يصبح `30 2 * * 1` هو `Mon *-*-* 02:30:00`. لاختبار الترجمة، استخدم `systemd-analyze calendar 'Mon *-*-* 02:30:00'`.",{"title":125,"body":126},"إنشاء ملفَي ‎.service و‎.timer","أنشئ `\u002Fetc\u002Fsystemd\u002Fsystem\u002Fcertbot-renew‎.service` بـ `Type=oneshot`، `ExecStart=\u002Fusr\u002Fbin\u002Fcertbot renew --quiet`، و`User=root`. ثم أنشئ `\u002Fetc\u002Fsystemd\u002Fsystem\u002Fcertbot-renew‎.timer` بـ `OnCalendar=Mon *-*-* 02:30:00` و`Persistent=true`. نفِّذ `systemctl daemon-reload && systemctl enable --now certbot-renew‎.timer`.",{"title":128,"body":129},"تعطيل سطر cron والتحقق","علِّق أو احذف السطر في ‪crontab‬ الأصلي. اختبر فوراً بـ `systemctl start certbot-renew‎.service` وراجع النتيجة عبر `journalctl -u certbot-renew‎.service -n 20`.",{"type":131,"body":132},"tip","لمهمة يجب تشغيلها بعد دقائق من الإقلاع ثم بصورة منتظمة، ادمج `OnBootSec=5min` و`OnUnitActiveSec=1h` في كتلة `[Timer]`. تبدأ المهمة بعد 5 دقائق من الإقلاع، ثم كل ساعة من هناك.",{"type":31,"title":134,"body":135},"استكشاف أخطاء systemd timers الشائعة","تظهر ثلاث مشاكل بشكل متكرر عند إعداد الـ‪timers‬. الأولى: الـ‪timer‬ نشط لكنه لا يُطلَق — نسيان `daemon-reload` بعد تعديل ملف وحدة هو السبب الأول. الثانية: الخدمة تفشل بصمت — راجع `journalctl -u myservice‎.service -n 50`. الثالثة: المهام الفائتة لا تُعاد — تأكد من وجود `Persistent=true` في كتلة `[Timer]`.",{"type":31,"title":137,"body":138},"خلاصة","‪cron‬ و‪systemd timers‬ يتعايشان بلا مشاكل على نفس الخادم — لا يلزمك ترحيل كل شيء دفعة واحدة. احتفظ بـ‪cron‬ لمهامك البسيطة، واعتمد ‪systemd timers‬ للأتمتة الجديدة التي تستفيد من سجلات ‪journald‬ وتبعيات الخدمات أو عزل ‪cgroup‬.","VPS Linux جاهز لأتمتتك","‪VPS‬ السحابية لدينا التي تعمل بـ‪Ubuntu‬ و‪Debian‬ تتضمن ‪systemd‬ و‪journald‬ والمكدس الحديث الكامل. انشر ‪timers‬ وسكريبتاتك ونسخك الاحتياطية على بنية تحتية موثوقة.","ابدأ VPS Linux","\u002Fvps-cloud",[144,159,173],{"id":145,"slug":146,"slugs":147,"title":150,"excerpt":151,"readTime":152,"views":153,"isPinned":16,"publishedAt":154,"category":155,"categories":156,"featuredImage":25,"bgImage":26,"posterImage":158,"relatedSolution":25},31,"تثبيت-apache-airflow-على-خادم-vps-أتمتة-ذاتية-الاستضافة",{"fr":148,"en":149,"ar":146},"installer-apache-airflow-vps","installing-apache-airflow-on-a-vps-self-hosted-automation","‎Apache Airflow sur ‎VPS : guide ‎Docker et ‎CVE-2026-58076","انشر ‎Apache Airflow على ‎VPS مع ‎Docker Compose. دليل شامل يتضمن إصلاح ‎CVE-2026-58076 (‎CVSS 9.1): التحديث إلى ‎Airflow 2.10.4 وإجراءات التصليب.",5,0,"2026-05-20T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":21},[157],{"id":19,"name":20,"slug":21,"color":22,"icon":21},"\u002Fblog\u002Fcovers\u002Finstaller-apache-airflow-vps-poster.svg",{"id":160,"slug":161,"slugs":162,"title":165,"excerpt":166,"readTime":167,"views":15,"isPinned":16,"publishedAt":168,"category":169,"categories":170,"featuredImage":25,"bgImage":26,"posterImage":172,"relatedSolution":25},212,"woodpecker-ci-وforgejo-خط-أنابيب-cicd-على-خادم-vps",{"fr":163,"en":164,"ar":161},"woodpecker-ci-pipeline-vps-forgejo","woodpecker-ci-and-forgejo-cicd-pipeline-on-a-vps","Woodpecker CI وForgejo: خط أنابيب CI\u002FCD على خادم VPS","انشر Woodpecker CI مع Forgejo على خادم VPS لخط أنابيب CI\u002FCD مفتوح المصدر، مستضاف ذاتيًا وخفيف وسيادي. دليل Docker خطوة بخطوة.",4,"2026-08-02T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":21},[171],{"id":19,"name":20,"slug":21,"color":22,"icon":21},"\u002Fblog\u002Fcovers\u002Fwoodpecker-ci-pipeline-vps-forgejo-poster.svg",{"id":174,"slug":175,"slugs":176,"title":179,"excerpt":180,"readTime":181,"views":182,"isPinned":16,"publishedAt":183,"category":184,"categories":185,"featuredImage":25,"bgImage":26,"posterImage":187,"relatedSolution":188},29,"تثبيت-kestra-على-خادم-vps-أتمتة-ذاتية-الاستضافة",{"fr":177,"en":178,"ar":175},"installer-kestra-vps","installing-kestra-on-a-vps-self-hosted-automation","تثبيت Kestra على خادم VPS: أتمتة ذاتية الاستضافة","ثبّت Kestra على خادم VPS الخاص بك: تنسيق سير عمل تصريحي بصيغة YAML لأنابيب البيانات وETL، بأتمتة ذاتية الاستضافة مع Docker.",3,7,"2026-05-22T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":21},[186],{"id":19,"name":20,"slug":21,"color":22,"icon":21},"\u002Fblog\u002Fcovers\u002Finstaller-kestra-vps-poster.svg",{"categorySlug":189,"appSlug":190},"الأتمتة-وسير-العمل","kestra",1787580959482]