Insomniac: Mac کو لِڈ بند رکھتے ہوئے جگائے رکھو، بغیر گرم کیے
مسئلہ
میں چاہتا تھا کہ میرا Mac لِڈ بند رکھتے ہوئے بھی چلتا رہے۔ ڈِم نہیں: اصل میں کام کرتا ہوا، رات بھر ایک AI ایجنٹ، ایک Xcode آرکائیو، ایک لمبا سِنک، لِڈ بند، کوئی ایکسٹرنل مانیٹر نہیں۔ macOS اسے کلیم شیل سلیپ کہتا ہے، اور اسے پرواہ نہیں کہ آپ کا کام بیچ میں ہے۔
پیچ میکانزم میں ہے۔ مقبول کیپ-اویک ٹولز IOKit پاور اسرشنز استعمال کرتے ہیں، اور وہ کلیم شیل سلیپ کو تب تک نہیں روکتے جب تک آپ کے پاس ایک ایکسٹرنل ڈسپلے، پاور، اور ایک کی بورڈ نہ جڑا ہو، بالکل وہی سیٹ اپ جس سے میں بچنا چاہتا تھا۔ اکلوتا لیور جو بغیر کچھ جوڑے کام کرتا ہے، وہ ایک پریویلجڈ کمانڈ ہے: pmset disablesleep۔ تو پورا پروڈکٹ اصل میں ایک ہی چیز ہے، ایک خطرناک سسٹم سیٹنگ کے گرد ایک سیف ریپر، اور باقی سب کچھ اس ایک لیور کو سیف اور خوشگوار طریقے سے کھینچنے کے قابل بنانے کے لیے ہے۔
فیصلے
سیفٹی فیچر ہے، جاگے رہنا نہیں۔ ایک جینرک پیڈ کیپ-اویک ایپ شروع میں ہی مری ہوئی ہے: Amphetamine اور caffeinate پہلے سے مفت میں یہ کرتے ہیں۔ بغیر سرو کیا گیا اینگل تھا گرمی۔ بند لِڈ ایئر فلو کو گھونٹتی ہے، اور کوئی موجودہ ٹول اس کے بارے میں ایک لفظ نہیں کہتا۔ تو Insomniac “جاگے رہو” نہیں ہے، یہ “مشین کو گرم کیے بغیر جاگے رہو” ہے۔
macOS جو ایمانداری سے ایکسپوز کرتا ہے اسے ناپو، نقلی ڈگریاں نہیں۔ پرکشش ورژن ایک CPU درجہ حرارت پڑھتا ہے اور ڈگریوں میں ایک کاؤنٹ ڈاؤن دکھاتا ہے۔ پر Apple Silicon ڈائی درجہ حرارت پڑھنے کا کوئی سپورٹڈ طریقہ ایکسپوز نہیں کرتا؛ جو کچھ بھی ایسا دعویٰ کرتا ہے وہ پرائیویٹ کیز پڑھ رہا ہے جو ماڈلز کے بیچ ٹوٹتی ہیں۔ تو میں نے ProcessInfo.thermalState (nominal, fair, serious, critical) پر بنایا، جسے کوئی ایڈمن نہیں چاہیے اور جو ہمیشہ کے لیے سپورٹڈ ہے۔ اور اصل حفاظت ایک اپ فرنٹ پریڈکشن ہے ہی نہیں: یہ ایک لائیو تھرمل کٹ آف ہے جو لِڈ بند رہتے ہوئے اسٹیٹ پر نظر رکھتی ہے اور اگر یہ بڑھے تو سیشن آٹو-اسٹاپ کر دیتی ہے۔ ایک پریڈکشن غلط ہو سکتا ہے؛ ایک لائیو کٹ آف گراؤنڈ ٹروتھ ہے۔
ایک آرکیٹیکچر جہاں خطرناک حصہ سویپ ایبل ہے۔ pmset کو روٹ کے طور پر چلانے کے دو راستے ہیں: ایک AppleScript پرامپٹ جو ہر ٹوگل پر پاس ورڈ مانگتا ہے (معمولی، پہلے دن کام کرتا ہے) اور XPC پر ایک پریویلجڈ ہیلپر جو خاموشی سے ٹوگل کرتا ہے (پروڈکشن-گریڈ، سائننگ اور ایک پن کیے گئے کنٹریکٹ کی ضرورت)۔ ایپ کو کسی ایک سے جوڑنے کے بجائے، میں نے دونوں کو ایک PowerControlling پروٹوکول کے پیچھے چھپایا۔ میں نے پہلے دن پاس ورڈ-پرامپٹ ورژن شپ کیا اور بعد میں سائلنٹ ہیلپر بغیر کسی کالر تبدیلی کے جوڑا۔ ہیلپر لاکڈ ڈاؤن ہے: ایک روٹ ڈیمن کے طور پر یہ صرف ان XPC کنکشنز کو قبول کرتا ہے جو اس ایپ کے آئیڈینٹیفائر اور Team ID سے پن کیے ہوں۔
سیفٹی انویریئنٹس کوڈ کے ذریعے نافذ کیے جاتے ہیں۔ ایک کیپ-اویک ایپ میں ایک تباہ کن ناکامی ہے: کام ختم ہونے کے بعد سلیپ کو ڈس ایبلڈ چھوڑ دینا۔ میں نے “سلیپ کو کبھی ڈس ایبلڈ نہ چھوڑو” کو ایک انویریئنٹ مانا اور ہر ایگزٹ بند کیا۔ ٹوگل آف، آٹو-آف، تھرمل کٹ آف، اور بیٹری کٹ آف سب سلیپ ری اسٹور کرتے ہیں۔ کوئٹ اور لاگ آؤٹ ٹرمینیشن کو تب تک ٹالتے ہیں جب تک ری اسٹور پورا نہ ہو؛ ایپ سلیپ ڈس ایبلڈ رہتے ہوئے مرنے سے انکار کرتی ہے۔ ایک ہارڈ کریش انٹرسیپٹ نہیں کیا جا سکتا، تو اگلے لانچ پر ایپ بغیر کسی ایکٹو سیشن کے سلیپ ڈس ایبلڈ پاتی ہے اور اسے ری سیٹ کرنے کی پیشکش کرتی ہے۔ کوئی “غیر معینہ” بھی نہیں ہے: سب سے لمبا سیشن ایک سخت 8-گھنٹے کی حد ہے، کیونکہ “ہمیشہ کے لیے” بالکل وہی سیٹنگ ہے جو ایک مرا ہوا، گرم لیپ ٹاپ بیگ میں چھوڑ دیتی ہے۔
ایماندار UI، ایماندار پرائیویسی۔ ایپ صرف مینو-بار ہے۔ ایڈوائزری ایک رسک لیول (low, moderate, high) اور ایک سادہ میسج دکھاتی ہے، کبھی وہ ڈگریاں نہیں جنہیں میں ایمانداری سے نہیں پڑھ سکتا، اور ویدر نج سوچ سمجھ کر سب سے کمزور ان پٹ ہے: ایک گرم کمرہ رسک بڑھا سکتا ہے، پر ایک ٹھنڈا کمرہ ایک گرم ہوتے CPU کو کبھی سیف نہیں بنا سکتا۔ ویدر لوکیشن IP جیو لوکیشن سے آتی ہے، سٹی-لیول، تو کوئی GPS پرمیشن پرامپٹ نہیں؛ ویدر بند کرو اور ایپ کچھ نہیں بھیجتی۔ کوئی ٹیلی میٹری نہیں، کوئی اینالیٹکس نہیں۔
وہ بگ جو مجھے صرف اس کے ساتھ جی کر ملا۔ V1 نے Mac کو جگائے رکھا، پر اسکرین لِڈ بند رہتے ہوئے جلتی رہی، کیونکہ سلیپ ڈس ایبل کرنا macOS کو انٹرنل ڈسپلے بند کرنے سے بھی روکتا ہے۔ کی بورڈ کے خلاف جلتی ایک بیک لائٹ ضائع بیٹری اور گرمی ہے، بالکل وہی چیز جس سے ایپ بچاتی ہے۔ میں نے ایک لِڈ مانیٹر جوڑا جو اوپن-سے-کلوزڈ ایج پر فائر ہوتا ہے اور ڈسپلے کو ایک بے ضرر یوزر-لیول کمانڈ سے سلیپ کراتا ہے، پریویلجڈ ہیلپر سے سوچ سمجھ کر الگ رکھا گیا۔ جس چیز کو اس کی ضرورت نہیں، اس کے لیے لِیسٹ پریویلج۔
ابھی شپ کرو، رف ایج کو اپناؤ۔ کور فیچر کو App Sandbox آف چاہیے، جو Mac App Store کو باہر کر دیتا ہے، تو میں نے ایک ڈائریکٹ ڈاؤن لوڈ شپ کیا۔ پہلے Apple کی پیپر ورک پر دن گزارنے کے بجائے، میں نے ابھی ایک اَن-نوٹرائزڈ بلڈ شپ کیا اور نتیجتاً آنے والی Gatekeeper وارننگ کو ایک گائیڈڈ، ایک-منٹ کا اسٹیپ بنایا: انسٹالر ایک ہاتھ سے بنائی سیٹ اپ گائیڈ ہے، کوارنٹین-کلیئرنگ کمانڈ ایپ کے بالکل ساتھ ایک کاپی کرنے لائق فائل کے طور پر ہے، اور ایپ ہر لانچ پر اپنا کوارنٹین فلیگ ہٹا دیتی ہے تاکہ وارننگ کبھی واپس نہ آئے۔ پیکجنگ اسکرپٹ ایک سرٹیفکیٹ موجود ہوتے ہی ایک کمانڈ سے ری-سائن اور نوٹرائز کر دیتی ہے۔
نتیجہ
Insomniac لائیو ہے: ایک مینو-بار ایپ جو Mac کو لِڈ-بند جگائے رکھتی ہے، ایک لائیو تھرمل کٹ آف، ایک بیٹری کٹ آف، کریش ریکوری، اور ایک سائن کیے ہیلپر کے ذریعے سائلنٹ ٹوگلنگ کے ساتھ۔ پوری چیز دو اصولوں پر ٹکی ہے: ایماندار رہو (اصل میکانزم، نقلی ڈگریوں کے بجائے رسک لیولز، ایک کمزور سگنل کو کمزور رکھا) اور رف ایجز کو چھپانے کے بجائے اپناتے ہوئے تیزی سے شپ کرو۔ ایک کیپ-اویک ایپ ایک چھوٹی چیز ہے، پر یہ ایک ایسی سیٹنگ کو چھوتی ہے جو ہارڈ ویئر کو نقصان پہنچا سکتی ہے، تو ہر شارٹ کٹ جو ڈیمو کو زیادہ چمکدار بناتا، وہ پروڈکٹ کو کم بھروسے مند بناتا۔