مرجع سطر الأوامر
كل خيارات الأمرين، وجدولا رموز الخروج، وكيفية قراءة ما يُعاد. والنسخة السردية بما فيها من تعليل في صفحة CLI وCI.
أمران
chrono run يشغّل تطبيقًا بتاريخ ووقت مختلفين. وchrono calc يحسب تاريخًا ويخبرك بما يجعله مثيرًا للاهتمام. ويتشاركان قواعد الخطوات نفسها، فالإزاحة المكتوبة لأحدهما تعني الشيء نفسه في الآخر.
chrono version يجيب عن سؤال ثالث أصغر بكثير: أي إصدار هذا، وأيٌّ من النواتين هو الملف التنفيذي، وأي إصدار من البروتوكول يتحدث به. سطر واحد في المخرج القياسي ليتمكن أي سكربت من التقاطه.
chrono license يجيب عن الرابع: الترخيص الذي يوزَّع به هذا الإصدار، وإخلاء المسؤولية من الضمان، والمكوّنات الخارجية المرتبطة به. ويذكر أيضًا أين يوجد نص الترخيص الكامل وإشعارات الأطراف الخارجية على القرص، أو يعترف بغيابها إن لم تكن النسخة التي تشغّلها مصحوبة بها. يعرض --components كل مكوّن مضمَّن مع إصداره بدل ملخص.
يعرض chrono presets فهرس الإعدادات المسبقة كما يقرؤه --preset: كل إعداد مسبق في المجلد، مكتوبًا بالكلمات التي تقرؤها قواعد الحاسبة، وكل ملف كان سيرفضه مع السبب. يكتب --json المخطط chronomock.presets/1، ويحدد --dir مجلدًا آخر.
chrono run <target> [options] chrono calc [options] chrono version # chrono 0.4.0 (x64, protocol 1) chrono license # GPL-3.0-only وما يأتي معه chrono presets # الفهرس كما يقرؤه --preset chrono --help # طريقة الاستخدام لكل الأوامر
chrono run - الخيارات
| الخيار | ما يفعله |
|---|---|
--at <moment> |
اللحظة التي يبدأ عندها التشغيل، مكتوبةً بمنطقة الجلسة. إما مطلقة (2038-01-19T03:14:07) أو نسبية بإشارة في أولها (+1d و-2h). الوحدات: s m h d w mo q y - m للدقائق وmo للأشهر. وبدون هذا الخيار تبدأ ساعة الجلسة من الوقت الحقيقي الحالي، فيكون --mode xN وحده مجرد تشغيل الهدف أسرع. |
--zone +HH:MM |
منطقة الجلسة: المنطقة التي تُكتب بها اللحظة، وهي التي تُبلغ عنها استدعاءات الوقت المحلي في الهدف. إزاحة ثابتة بلا توقيت صيفي. وبدونه تُستخدم منطقة المضيف نفسه. |
--mode flow|frozen|xN |
flow يعمل بالسرعة الحقيقية، وfrozen يثبّت الساعة، وxN يشغّلها أسرع N مرة (x60 يحوّل الساعة إلى دقيقة، وx1440 يحوّل اليوم إلى دقيقة). |
--scale-duration |
سرّع محور الوقت المنقضي أيضًا: عدّادات النبضات، ووقت المقاطعة، وفترات السكون، والمؤقتات. تُعدّ انتظارات الكائنات وتبقى بطولها الحقيقي. معطّل افتراضيًا، لأن ساعة الحائط وساعة الإيقاف سؤالان مختلفان. المؤقت أو التأخير المضبوط على تاريخ ووقت محددين يتبع ساعة الجلسة مع هذا الخيار ومن دونه. |
--scale-qpc |
يضاعف أيضًا العدّاد عالي الدقة، وهو الموضع الذي تقرأ منه monotonic في Python 3.13+ وStopwatch في .NET وnanoTime في Java الزمن المنقضي. معطّل افتراضيًا: فالتطبيق الذي يقيس زمن رسمه بهذا العدّاد قد يبدو مشوَّهًا. |
--ticks N |
ينهي الجلسة بعد N نبضة، مدة كل منها ثانية حقيقية، ويُبلّغ. وبدونه تبقى الأداة متصلة حتى ينتهي الهدف وكل برنامج بدأه يعمل على ساعة الجلسة - فالمُشغِّل الذي ينتهي فورًا يترك الجلسة للتطبيق الذي بدأه. |
--timeout <s> |
يستسلم بعد هذا العدد من الثواني ويخرج بالرمز 6، لخط أنابيب لا يجوز أن يتجمّد. وبمعزل عن هذا الخيار، تُوقَف النواة التي لا تقول شيئًا طوال 15 ثانية وتخرج بالرمز 6 أيضًا - وفي الحالتين يُقطع التشغيل في منتصفه فلا يحمل حكمًا. |
--args "..." |
وسائط الهدف، سلسلة واحدة، تُقسَّم بالقاعدة نفسها التي يستخدمها Windows - فتبقى الوسيطة التي تحتوي مسافات سليمة. وفي هدف Chromium يُرفض --user-data-dir و--remote-debugging-port بدل تجاوزهما: فالجلسة تحتاج إلى ملف تعريف معزول خاص بها، وتشغيلها بصمت على ملف تعريف متصفحك الحقيقي هو الشيء الوحيد الذي يجب ألا يحدث. |
--cwd <dir> |
يبدأ الهدف في ذلك المجلد. وبدونه يرث الهدف مجلدنا، وهو ما كانت عليه كل التشغيلات قبل وجود هذا الخيار. والقيمة الفارغة خطأ في الاستخدام لا «بلا مجلد» - فالغياب والفراغ أمران مختلفان، والغياب وحده هو ما يمكن تمريره إلى Windows. والمجلد غير الموجود يوقف الجلسة بالخطأ target.cwd_missing قبل تشغيل أي شيء، بدل أن يظهر لاحقًا هدفًا يرفض البدء. |
--preset <id> |
يأخذ اللحظة والسرعة من presets/<id>.json. ولا يجتمع مع --at و--mode و--scale-duration، لأن الإعداد المسبق يصبح حينئذٍ المصدر الوحيد للاثنين. |
--param id=value |
يملأ معاملًا في الإعداد المسبق. قابل للتكرار، ويتطلب --preset. وفي run فقط يكون تاريخ بدء الفترة التجريبية افتراضيًا هو تاريخ إنشاء الملف التنفيذي للهدف نفسه، فيُحسب إعداد التجربة من اليوم الذي ثُبّت فيه التطبيق دون أن تكتبه. |
--set-after T:M |
عند النبضة T يغيّر السرعة إلى M. ويكون المُضاعِف في أثناء التشغيل 1 على الأقل - فالتجميد في منتصف الجلسة غير مُتاح هنا. |
--jump-after T:moment |
عند النبضة T يقفز بالساعة إلى تلك اللحظة، مطلقة أو نسبية، بمنطقة الجلسة. |
--force |
يُبقي الجلسة حتى عندما يقول الحكم الافتتاحي إن الاستبدال لم يسرِ - فبشكل افتراضي يُوقَف الهدف بدلًا من ذلك، لأن جلسة لم تُثبت شيئًا أسوأ من لا جلسة. لا يتغير الحكم، ولا رمز الخروج. هذا يحدد فقط هل يستمر الهدف في العمل. |
--no-embedded |
يترك صفحات الويب داخل التطبيق (WebView2 وQt WebEngine) على الساعة الحقيقية ولا يفتح منفذ تصحيح. وبدونه تطلب الجلسة من هذا المحرك فتح منفذ محلي، وتضع صفحاته على ساعة الجلسة عبره - وما دام المنفذ مفتوحًا يمكن لأي برنامج آخر على هذا الحاسوب استخدامه للوصول إلى تلك الصفحات. |
--elevated-embedded |
لتطبيق يعمل بصلاحيات المسؤول، ومن Chrono Mock يعمل بصلاحيات المسؤول أيضًا. يتجاهل WebView2 في مثل هذا التطبيق الإعداد الذي تصل به الجلسة إلى صفحاته، فتكتب الجلسة قيمة واحدة في سجل الجهاز (HKLM، باسم ملف .exe للتطبيق) طوال مدتها وتزيلها في النهاية. وما دام التطبيق يعمل يمكن لأي برنامج آخر على هذا الحاسوب الوصول إلى صفحاته عبر المنفذ، ويملك التطبيق صلاحيات المسؤول. لا يُستخدم مع --no-embedded. |
--keep-background-timers |
يشغّل محرك الويب - متصفح تطبيق Chromium أو Electron، أو المحرك داخل التطبيق - مع إيقاف إبطاء المؤقتات في النوافذ المخفية، فتحتفظ النافذة المصغّرة بسرعة الجلسة. ويعمل التطبيق عندئذٍ بكامل سرعته حتى وهو مخفي. التطبيق الذي يبدأ بصلاحيات المسؤول عبر --elevated-embedded لا يحصل عليه. |
--dry-run |
يطبع ما ستكونه الجلسة دون أن يبدأ أي شيء: اللحظة والمنطقة المحسومتين ومصدر كل منهما، وما ملأ به الإعداد المسبق كل معامل، والوسائط بعد التقسيم، وأيّ الآليتين سيتخذها الهدف. لا تبدأ أي عملية ولا يُكتب أي ملف، بما فيه الملف الذي يسمّيه --report. ويخرج بالرمز 0 لخطة قابلة للتنفيذ وبالرمز 2 لهدف غير موجود، وهو الرمز الذي يعطيه التشغيل الحقيقي للواقعة نفسها. والخطة لا تحمل حكمًا وتقول ذلك - فالحكم للجلسة الحقيقية وحدها. مع --json تكون الخطة بيانات، وتشمل session.elevated_embedded وsession.elevated_embedded_value، وهو اسم الملف الذي كانت ستُسمّى به قيمة السجل عندما ينطبق الخيار على هدف .exe، وإلا فهو null. وجود اسم هناك ليس وعدًا بالكتابة: فالجلسة لا تكتب القيمة إلا إذا كان Chrono Mock نفسه يعمل بصلاحيات المسؤول. |
--report <path> |
يكتب التقرير المكتوب للبشر في ملف. والحكم غير يعمل يجعل الملف يبدأ بشريط تحذير من أدلة غير موثوقة، لأن دليلًا يُخفي شكّه أسوأ من لا دليل. وتحصل جلسة حكمها يعمل على هذا الشريط أيضًا إذا لم يقرأ التطبيق أيًّا من الساعات التي تستبدلها الجلسة، أو إذا كان برنامجًا بلغة Go لا يصل Chrono Mock إلى ساعته الحائطية. ويذكر الملف أيضًا التشغيل نفسه: الإصدار ووقت البدء والهدف ومجلده والخيارات. |
--report-args |
مع --report يكتب أيضًا وسائط الهدف في ذلك الملف حرفيًا. وهو معطّل افتراضيًا لأن الوسيط قد يحمل كلمة مرور - فلا يذكر الملف حينها إلا عددها. |
--json |
يُخرج الجلسة سجلات مقروءة آليًا بدل التقرير - وهو التدفق نفسه الذي تستهلكه النافذة. ويذهب خرج تطبيق الطرفية نفسه إلى مجرى الأخطاء القياسي، فيحمل المجرى القياسي السجلات وحدها. والتطبيق الذي ما يزال يعمل عند انتهاء الجلسة يواصل الكتابة هناك، فكل ما يقرأ مجرى الأخطاء حتى نهايته ينتظره، والتشغيل يقول ذلك. |
chrono run - رموز الخروج
رمز الخروج هو حكم الجلسة، لا ما أعاده التطبيق. أما رمز خروج التطبيق نفسه فيُبلَّغ عنه منفصلًا، في التقرير وفي بيانات الجلسة - وصفحة CLI وCI تشرح لماذا صُمّم الأمر على هذا النحو.
| الرمز | المعنى |
|---|---|
| 0 | يعمل - كل عملية قرأت الوقت رأت ساعة الجلسة |
| 10 | يعمل جزئيًا - بعض القنوات مُغطّاة وبعضها لا |
| 11 | لا يعمل - لم يصل الاستبدال إلى القنوات الأساسية |
| 4 | غير محدَّد - تعذّر إثبات التغطية. «لا أستطيع الجزم» صادقة، لا نجاح مزعومًا أبدًا |
| 12 | اختفى الهدف مباشرة بعد الحقن ولم يترك شيئًا يعمل على ساعة الجلسة، ما يوحي بتطبيق ذي نسخة واحدة سلّم العمل إلى نسخة تعمل بالفعل، أو بتسليم إلى برنامج لم تستطع الجلسة دخوله، وهو عادةً من العمارة الأخرى (32 أو 64 بت). والهدف الذي يبدأ التطبيق ثم ينتهي مُشغِّل، وتستمر الجلسة مع التطبيق |
| 1 | خطأ في الاستخدام - خيار خاطئ، أو تعبير خاطئ، أو إعداد مسبق لا يقبله هذا الأمر |
| 2 | تعذّر تشغيل الهدف أو الحقن فيه |
| 3 | خطأ داخلي - تعذّر بدء المحرّك، أو صادف حالة غير متوقعة، أو توقف قبل أن يغلق الجلسة (أيًّا كان رمز خروجه). لا يحمل مثل هذا التشغيل أي حكم |
| 5 | العملية غير مضمَّنة في هذا الإصدار - مثل إعداد مسبق تحتاج لحظته إلى تقويم لا يستطيع run تحميله بعد. وهو متميّز عمدًا عن خطأ الاستخدام: فقد طلبت شيئًا غير موجود بعد، لا شيئًا خاطئًا |
| 6 | قُطع التشغيل - انتهت مهلة --timeout، أو توقف المحرّك عن الإجابة 15 ثانية فأُوقف. وهذا ليس حكمًا: فقد قُوطعت الجلسة، فلا تثبت شيئًا عن الهدف في أي اتجاه |
| 7 | جلسة أخرى تعمل بالفعل - جلسة واحدة في كل مرة. تكفي إعادة المحاولة بعد انتهائها |
| 8 | وصلت الجلسة إلى حكم، لكن دليلها ليس في الملف الذي يحدده --report - كان القرص ممتلئًا، أو كان برنامج آخر يُبقي الملف القديم مفتوحًا، فيبقى كما كان. يبقى الحكم في التقرير الذي يطبعه الأمر |
قراءة التقرير
بدون --json تنتهي الجلسة بتقرير نصي بسيط. وكل سطر فيه إما واقعة رصدتها الجلسة أو غائب - لا شيء يُملأ بقيمة افتراضية معقولة.
Chrono Mock - session report
target: .\build\test.exe
verdict: WORKS - time substitution took effect (processes: 1)
every process that read time saw the session clock
session: fake clock reached 2038-01-19T03:14:08
real elapsed 1.3s, fake elapsed 1.3s
exited: the target closed itself with code 3
covered channels (substituted, with call counts, 10 calls in all):
- pid 21240: GetSystemTimeAsFileTime (5 calls)
- pid 21240: GetLocalTime (5 calls)
observed channels (hooked but left real):
- pid 21240: NtCreateUserProcess (0 calls)
warnings:
- the target opened a network connection ...
- verdict - حكم الأسرة على العملية الأم وكل عملية فرعية، مع عدد العمليات. وهذا هو الرقم الذي يحمله رمز الخروج.
- exited - رمز خروج التطبيق نفسه، وفقط عندما أغلق نفسه بنفسه. فالتشغيل المحدود بـ
--ticksيترك الهدف يعمل، وجلسة Chromium تغلقها الأداة نفسها، والجلسة التي لم تبدأ لا رمز لها - فيغيب السطر بدل أن يعرض صفرًا مختلَقًا. ورمز التعطل يصل رقمًا سالبًا كبيرًا، فيُعرض أيضًا بالنظام السداسي العشري. - covered - القنوات التي بلغها الاستبدال، مع عدد المرات التي استُدعيت فيها فعلًا، لكل عملية على حدة. ولا تُجمع الأعداد عبر العمليات أبدًا: فتدقيق عملية لا يجوز أن يستعير أرقام عملية أخرى. يتوقف العدّاد عند 1048576 ويظهر بعدها على الأقل هذا العدد.
- observed - قنوات رُبطت لكن تُركت حقيقية عمدًا، كانتظار الكائنات والمؤقتات متعددة الوسائط. لها فئتها الخاصة، فلا تُقرأ أبدًا على أنها مستبدَلة.
- uncovered - قنوات طلبها التطبيق ولم تغطّها الجلسة. وهذا ما يحوّل الحكم إلى جزئي.
- not fully cleaned up - كل ما عجز التفكيك عن إزالته. يغيب عند النهاية النظيفة، وهي الحالة المعتادة.
chrono calc - الخيارات
لا لغة طبيعية: كل خيار خطوة واحدة، وترتيب الخيارات هو ترتيب الخطوات. وتُطبع النتيجة بعد كل خطوة، فتظهر الخطوة الخاطئة بدل أن تُدفن.
| الخيار | ما يفعله |
|---|---|
--base today|now|<moment> |
من أين يبدأ، والافتراضي today. يُحسم بمنطقة الجلسة. واليوم المستحيل مثل 2025-02-31 يُرفض ولا يُسوَّى بصمت إلى الشهر التالي. |
--base-utc <moment> |
مثل --base، لكن نقطة البداية لحظة بالتوقيت العالمي المنسّق (UTC) مع Z اختيارية في آخرها، وليست قراءة ساعة حائط في منطقة الجلسة. |
--shift ±N<unit> |
قابل للتكرار. الإشارة مطلوبة. الوحدات: s m h d w mo q y bd، أو أسماؤها الكاملة. m للدقائق وmo للأشهر. وتُطوى الأشهر والأرباع والسنوات على تاريخ التقويم مع تقليم، فالشهر بعد 31 يناير هو نهاية فبراير لا عدد ثابت من الدقّات. أما bd (أيام العمل) فيحتاج إلى --calendar. |
--set-time HH:MM:SS | يضبط وقت اليوم على النتيجة الحالية. |
--snap <target> |
يقفز إلى حدّ فترة: som eom soq eoq soy eoy (بداية أو نهاية الشهر أو الربع أو السنة). والبداية هي اليوم الأول عند 00:00:00، والنهاية اليوم الأخير عند 23:59:59. |
--nearest nbd|pbd |
أقرب يوم عمل إلى الأمام أو الخلف، ويُحتسب اليوم الحالي إن كان يوم عمل أصلًا. يحتاج إلى --calendar. |
--to-zone +HH:MM |
خطوة: يعيد التعبير عن اللحظة نفسها بإزاحة ثابتة أخرى. تبقى اللحظة كما هي، فلا تتحرك قيمة الحقبة وتتغير الحقول المدنية وحدها. ولا يُخلط مع --zone. |
--zone +HH:MM |
منطقة الجلسة، تُستخدم لحسم today وnow ولعرض النتيجة. وبدونه تُستخدم منطقة المضيف. |
--calendar us-banking|us-federal|pl |
يحمّل تقويم عطلات. يضيف إلى البيانات الوصفية يوم العمل والعطلة، ويفعّل bd و--nearest. ويختلف التقويمان الأمريكيان في كيفية مراعاة العطلة الواقعة في عطلة نهاية الأسبوع، وهذا بالضبط من نوع الخطأ بيوم واحد الذي وُضع الاختبار ليجده. كل تقويم يجيب عن نطاق من السنوات: pl من 2002 وus-federal من 1960 وus-banking من 2008. وخطوة أيام العمل التي تبلغ يومًا قبل ذلك النطاق تُرفض برمز الخروج 1، ويُعرض التاريخ السابق له على أنه غير مُقيَّم. وإذا مضى أكثر من سنة على آخر مطابقة لعطلات التقويم مع القانون، فإن اليوم اللاحق الذي حكم عليه يحمل العلامة calendar_outdated لأن عطلة أحدث قد تكون ناقصة. |
--preset <id> --param id=value |
لحظة مسمّاة من presets/<id>.json بعد ملء معاملاتها. لا تجتمع مع خيارات الخطوات ولا مع --analyze، وتتركّب مع --calendar و--zone و--format. |
--analyze <date> |
يقرأ تاريخًا ملصقًا ويقول ما هو. وتاريخ مثل 04/08 الملتبس يُعرض بالقراءتين معًا، الأمريكية والبولندية، بدل التخمين - فهذا الالتباس مصدر حقيقي لبلاغات أعطال خاطئة. |
--format <mask> |
يطبع النتيجة بقناعك أنت أيضًا، لتطابق صيغة التطبيق قيد الاختبار: yyyy-MM-dd HH:mm:ss. والرموز حساسة لحالة الأحرف على طريقة .NET وJava - M للشهر وm للدقيقة. |
--json |
مخرجات آلية (chronomock.calc/1) لأي مما سبق، ليحسب خط الأنابيب تاريخًا ويمرّره مباشرة إلى chrono run. |
# آخر يوم عمل في الربع، بتقويم المصارف الأمريكية chrono calc --base today --snap eoq --nearest pbd --calendar us-banking
chrono calc - رموز الخروج
جدول منفصل أصغر: فالحاسبة لا حكم تغطية لديها لتُبلّغ به.
| الرمز | المعنى |
|---|---|
| 0 | تم الحساب |
| 1 | خطأ في الاستخدام - خيار خاطئ، أو تاريخ مستحيل، أو تجاوز للمدى، أو ملف تقويم لا يحتوي يوم عمل واحدًا |
| 5 | الخطوة أو الوحدة غير مضمَّنة في هذا الإصدار، أو تحتاج الخطوة إلى تقويم لم تمرّره. منفصل عن خطأ الاستخدام عمدًا، ليفرّق السكربت بين «لم يحن بعد» و«خطأ» |