
इस तथ्य के कारण कि मोबाइल उपकरणों में लंबे समय से व्यापक कार्यक्षमता है, स्वचालन कार्यों को आसानी से उन्हें स्थानांतरित किया जा सकता है। और, जितना संभव हो सके, क्रोन उन्हें निष्पादित करने के लिए बस उतना ही अच्छा है। लेकिन अगर क्रोन को "साधारण" लिनक्स सिस्टम में थोड़ा समय लगता है, तो एंड्रॉइड डिवाइस को इसे कॉन्फ़िगर करने के लिए अधिक जटिल काम की आवश्यकता होती है।
यदि आप स्वचालन के विषय में रुचि रखते हैं और आप चाहते हैं कि डिवाइस खोलते ही आपकी शेल स्क्रिप्ट तुरंत लॉन्च हो जाए, और यहां तक कि टाइमर द्वारा भी शुरू किया जा सकता है - बिल्ली का स्वागत!
प्रस्तावना
मैं एंड्रॉइड के लिए मोबाइल उपकरणों के स्वचालन में संलग्न हूं। और स्वचालित स्क्रिप्ट के निष्पादन के दौरान, कई अप्रत्याशित परिस्थितियां उत्पन्न होती हैं, भले ही परीक्षण के लिए उसी उपकरणों का उपयोग किया जाता हो।
सबसे लोकप्रिय समस्याएं:
0. स्वचालन स्क्रिप्ट वह नहीं करती जो आप चाहते थे।
1. मोबाइल एप्लिकेशन अपने आप डाउनलोड हो जाता है
2. स्वचालित फोन रिबूट
3. मोबाइल एप्लिकेशन पुनरारंभ होने के बाद स्वचालित रूप से शुरू नहीं होता है
4. वाई-फाई मॉड्यूल बेतरतीब ढंग से बंद हो जाता है, नेटवर्क नहीं पाता है, नेटवर्क से कनेक्ट नहीं होता है
5. मोबाइल नेटवर्क अचानक गायब हो गया
6. फोन स्लीप मोड में चला गया
7. प्रॉक्सी गिरा या स्वयं सर्वर या सर्वर ने एक अजीब प्रतिक्रिया दी
इस वजह से, आपको डिवाइस की लगातार निगरानी करनी होगी और इन अप्रत्याशित स्थितियों को पकड़ना होगा।

इस प्रकार, मैं इस निष्कर्ष पर पहुंचा कि "सही" लिपियों के साथ क्रोन आपको सॉफ़्टवेयर विफलताओं को ट्रैक करने और स्वचालन स्क्रिप्ट को पुनर्स्थापित करने या फिर से चलाने की अनुमति देगा। लेकिन जैसा कि यह पता चला है, हालांकि एंड्रॉइड में लिनक्स कर्नेल शामिल है, वहां विशेष बारीकियां हैं जिनसे मुझे निपटना था। तो चलिए शुरू करते हैं!
क्रोन सेटअप
पर्यावरण को अनुकूलित करें
- एक यूएसबी वायर का उपयोग करके शेल के माध्यम से डिवाइस तक पहुंचने के लिए एडीबी स्थापित करें।
- हम डेवलपर्स के लिए अनुभाग खोलते हैं। ऐसा करने के लिए, अबाउट फोन सेक्शन में जाएं और बिल्ड नंबर या कुछ समान पर कुछ क्लिक करें।
- हम डेवलपर्स के लिए अनुभाग पर जाते हैं और इसे चालू करते हैं। हम डिवाइस को कंप्यूटर से कनेक्ट करते हैं और इस डिवाइस पर कंप्यूटर पर एक्सेस की अनुमति देते हैं।
- अपने डिवाइस के लिए रूट जोड़ें। सबसे आम विकल्प हैं SuperSu , Magisk, और Kingroot । W3bsit3-dns.com पर जाएं और अपने डिवाइस के लिए रूट विकल्प खोजें। दुर्भाग्य से, कोई सार्वभौमिक जड़ नहीं है।
- हम बिजीबॉक्स स्थापित करते हैं (यह w3bsit3-dns.com पर भी है, उदाहरण के लिए), क्योंकि इसमें सिर्फ क्रोन प्रोग्राम शामिल है।
मैनुअल शुरू सेटिंग
- हम अदब शेल का उपयोग करके फोन से कनेक्ट करते हैं (यदि आपके पर्यावरण चर में अदब पंजीकृत नहीं है, तो पूर्ण पथ जोड़ें।
- र कमांड के साथ रूट मोड पर जाएं
- हम क्रॉन प्रोग्राम की उपस्थिति की जांच करते हैं और crond -h कमांड का उपयोग करके सेटिंग्स देखते हैं
निष्पादन परिणामcrond: invalid option -- h BusyBox v1.29.2-Stericson (2018-08-12 11:19:12 EDT) multi-call binary. Usage: crond -fbS -l N -d N -L LOGFILE -c DIR -f Foreground -b Background (default) -S Log to syslog (default) -l N Set log level. Most verbose 0, default 8 -d N Set log level, log to stderr -L FILE Log to FILE -c DIR Cron dir. Default:/var/spool/cron/crontabs
जैसा कि आप अंतिम पंक्ति से देख सकते हैं, डिफ़ॉल्ट निर्देशों को निर्देशिका
/ var / spool / cron / crontabs में संग्रहीत किया जाना चाहिए, जो स्वचालित रूप से नहीं बनाया गया है और यदि हम कमांड चलाते हैं
crond -b
और फिर देखें कि क्या प्रक्रिया शुरू हुई
ps | grep crond
, तो यह वहाँ नहीं हो सकता है, क्योंकि उसे कोई निर्देश नहीं मिला। तो चलिए कमांड को निष्पादित करते हैं
crond -b -fd0
और देखें कि क्या कारण है। सबसे अधिक संभावना है कि आपके पास एक समान त्रुटि होगी:
crond: can't change directory to '/var/spool/cron/crontabs': No such file or directory
। इस मामले में, यह सामान्य है, क्योंकि भविष्य में, हम स्वयं को क्रॉस्टैब निष्पादन योग्य फ़ाइल के लिए पथ का संकेत देंगे।
4. एक साधारण crontab फ़ाइल बनाएँ:
mkdir /data/crontab echo "*/1 * * * * echo 'text' >> /sdcard/test.txt" > /data/crontab/root
अब हमारा एक कार्य है कि हर मिनट में शब्द
पाठ को फ़ाइल
/sdcard/test.txt में जोड़ा जाएगा
हम लॉन्च करते हैं:
crond -b -fd0 -c /data/crontab
और निम्नलिखित लॉग प्राप्त करें:
crond: crond (busybox 1.29.2-Stericson) started, log level 0 crond: ignoring file 'root' (no such user) ...
बेशक, यह थोड़ा आश्चर्यचकित करने वाला है, क्योंकि अगर हम
whoami कमांड निष्पादित करते हैं
, तो यह परिणाम के रूप में वापस आ जाएगा।
5. रूट उपयोगकर्ता जोड़ें, क्योंकि क्रोन पूछता है:
mount -o remount,rw /system; echo "root:x:0:0::/system/etc/crontabs:/system/bin/sh" >> /system/etc/passwd; mount -o remount,ro /system;
इस फ़ाइल की कमी के कारण, मुझे एहसास हुआ कि एंड्रॉइड सिस्टम में यह बिल्कुल भी शामिल नहीं है। यदि आप सुनिश्चित हैं कि आप अपनी कॉन्टैब फ़ाइलों को कहाँ संग्रहीत करेंगे, तो आप अपनी ज़रूरत के अनुसार लाइन
/ सिस्टम / etc / crontabs को बदल सकते हैं। फिर से कमांड चलाएँ
crond -b -fd0 -c /data/crontab
और हम निम्नलिखित प्राप्त करते हैं:
crond: user:root entry:*/1 * * * * echo 'text' >> /sdcard/test.txt 111111111111111111111111111111111111111111111111111111111111 111111111111111111111111 11111111111111111111111111111111 111111111111 1111111 crond: wakeup dt=16 crond: file root: crond: line echo 'text' >> /sdcard/test.txt crond: job: 0 echo 'text' >> /sdcard/test.txt crond: can't change directory to '/system/etc/crontabs' crond: can't change directory to '/var/spool/cron': No such file or directory crond: USER root pid 12849 cmd echo 'text' >> /sdcard/test.txt
हालाँकि, लॉग के अनुसार, कार्य crond में पंजीकृत था, लेकिन मेरे मामले में फ़ाइल नहीं बनाई गई थी। समस्या को बहुत सरलता से हल किया जा सकता है:
mkdir -p /system/etc/crontabs
खैर, वह चाहता है कि एक निर्देशिका वहां मौजूद हो, जो हम उसे मना करते हैं! हम फिर से शुरू करते हैं और देखते हैं:
crond: user:root entry:*/1 * * * * echo 'text' >> /sdcard/test.txt 111111111111111111111111111111111111111111111111111111111111 111111111111111111111111 11111111111111111111111111111111 111111111111 1111111 crond: wakeup dt=12 crond: file root: crond: line echo 'text' >> /sdcard/test.txt crond: job: 0 echo 'text' >> /sdcard/test.txt crond: child running /system/bin/sh crond: USER root pid 13033 cmd echo 'text' >> /sdcard/test.txt
त्रुटियां दूर हो गईं और लाइन
क्रोन: बच्चा चल रहा है / सिस्टम / बिन / श दिखाई दिया । अंत में, क्रोन सफलतापूर्वक घाव हो गया है, और आप दूसरे भाग पर जा सकते हैं!
स्वचालित शेल स्क्रिप्ट डाउनलोड
लिनक्स सिस्टम में एक
init.d निर्देशिका है जो सिस्टम बूट के तुरंत बाद ऑटोस्टार्ट के लिए जिम्मेदार है, तो चलिए इस तरह से कोशिश करते हैं!
1. जांचें कि क्या यह निर्देशिका आपके डिवाइस पर मौजूद है (यह
/etc/init.d या
/system/etc/init.d है - यह वही माउंटेड पार्टीशन है)। मेरे मामले में, यह नहीं है। खैर, फिर बनाएँ:
mount -o remount,rw /system mkdir /system/etc/init.d chmod 0755 /system/etc/init.d mount -o remount,ro /system
अब वहां कुछ सरल स्क्रिप्ट जोड़ें, उदाहरण के लिए:
echo "echo 'Init.d is working !!!' >> /sdcard/init_test.log" > /system/etc/init.d/90my_script chmod 777 /system/etc/init.d/90my_script
हम डिवाइस को रिबूट करते हैं और देखते हैं कि क्या चमत्कार हुआ ... दुर्भाग्य से, मेरी फ़ाइल दिखाई नहीं दी।
हम आगे सिस्टम की जांच करते हैं और कुछ इनिट फ़ाइल की तलाश करते हैं जो लॉन्च के बाद स्क्रिप्ट चला सकते हैं। मेरे डिवाइस में
/init.rc में एक फाइल थी। खैर, आइए इसे बदलने और डिवाइस को रिबूट करने का प्रयास करें:
mount -o remount,rw / echo "echo 'Init.d is working !!!' >> /sdcard/init_test.log" >> /init.rc mount -o remount,ro / reboot
लेकिन फाइल दोबारा नहीं बनाई गई। हम फ़ाइल
/init.rc को देखने के लिए
जाते हैं और हमारा रिकॉर्ड गायब हो गया और फ़ाइल को परिवर्तित नहीं हुआ, क्योंकि निर्माण की तारीख काफी अजीब है (मेरे मामले में, 1 जनवरी, 70 05:00:00)।
हम समझते हैं, और यह पता चलता है कि यह फ़ाइल
boot.img में संग्रहीत है, और हर बार यह इससे बाहर निकल जाता है। और
init.rc फ़ाइल की कार्यक्षमता को बदलने के लिए,
आपको यह सब करने की आवश्यकता है।
लेकिन इस समस्या को हल करने में मदद करने का एक आसान तरीका है। इस विधि के लिए, हम निम्नलिखित शेल स्क्रिप्ट का उपयोग कर सकते हैं (Ryuinferno को धन्यवाद कहें):
स्क्रिप्ट के साथ शुरुआत करना! मेरे मामले में, इसे init.sh कहा जाएगा।
1. मोबाइल डिवाइस के एसडीकार्ड में फाइल डाउनलोड करें:
adb push /tmp/init.sh /sdcard
2. मोबाइल डिवाइस की मेमोरी पर कॉपी करें और आवश्यक अधिकार सेट करें:
adb shell su cp /sdcard/init.sh /data/init.sh chmod 777 /data/init.sh
3. निष्पादन के लिए चलाएं:
/data/init.sh
और उस लॉग पर ध्यान दें जो प्रदर्शित होता है। यहाँ मेरा लॉग है:
लॉग लॉग करें Init.d Enabler by Ryuinferno @ XDA Hello Supaa User! :P busybox found! Awesome! grep found! :D Good! run-parts found! :) Great! Let's proceed... Press enter to continue... Mounting system as rewritable... Removing old sysinit file rm: /system/bin/sysinit: No such file or directory Checking for the presence of sysinit in /system/bin... sysinit not found, creating file... Setting correct permissions and ownership for sysinit... Checking for the presence of install-recovery.sh... install-recovery.sh not found, creating it... Setting the correct permissions and ownership for install-recovery.sh... Also for install-recovery-2.sh if it exists... Checking for the presence of the init.d folder... init.d folder found... Creating basic init.d scripts... Creating permissive SELinux script... Setting correct permissions and ownership for init.d folder and scipts... Mounting system as read-only... Done!!! Please reboot at least twice before checking /data... If init.d is working, you will see a Test.log in /data... Enjoy!!! =) Ryuinferno @ XDA 2013
जैसा कि आप लॉग से देख सकते हैं, कोई त्रुटि नहीं है, इसलिए हम सुरक्षित रूप से डिवाइस को रिबूट करते हैं! शायद किसी ने पहले से ही काम किया है और आप
/data/Test.log फ़ाइल पा सकते हैं, लेकिन मेरे पास यह नहीं है।
Ls कमांड का उपयोग करके
/system/etc/init.d निर्देशिका की जाँच करें:
00test 01permissive 08setperm
जैसा कि आप देख सकते हैं, कार्यों को सफलतापूर्वक बनाया गया है। आपको अभी भी
boot.img बदलना पड़ सकता है, लेकिन आइए शुरुआत में देखें, कि कमांड के साथ
install-recovery.sh फ़ाइल कहाँ है
find / -name "install-recovery.sh" ... /system/bin/install-recovery.sh /system/etc/install-recovery.sh ...
जैसा कि हम देख सकते हैं, हमारे पास 2 फाइलें हैं जो विभिन्न स्थानों पर स्थित हैं। निर्माण की तिथि तक, हम देख सकते हैं कि स्क्रिप्ट ने
/system/etc/install-recovery.sh निर्देशिका में फ़ाइल बनाई है, हालाँकि, शायद, कुछ मामलों में इसे
/ सिस्टम / आदि में बनाना चाहिए
। चलो फ़ाइल को बिन में नाम दें और फ़ाइल को आदि से कॉपी करें:
mount -o remount,rw /system mv /install-recovery.sh /system/bin/install-recovery2.sh cp /install-recovery.sh /system/bin/
UPD : कृपया ध्यान दें कि दोनों फाइलों के लिए सुरक्षा संदर्भ का मिलान होना चाहिए। और अगर आप नकल करते समय अचानक खो गए (हालांकि सिद्धांत में यह नहीं होना चाहिए), आपको इसे पुनर्स्थापित करने की आवश्यकता होगी (उदाहरण के लिए,
chcon उपयोगिता के माध्यम से)। पूरी फाइल जानकारी देखें
ls -lZ के साथ:
ls -lZ /system/etc/install-recovery.sh
यहाँ
u: object_r: system_file: s0 सुरक्षा संदर्भ है।
और फिर से हम डिवाइस को रिबूट करते हैं ... और अब, आखिरकार, लंबे समय से प्रतीक्षित सफलता! फ़ाइल
/data/Test.log दिखाई दी है!
एक बार जब सब कुछ काम करता है, तो
/system/etc/init.d पर जाएं और एक शेल स्क्रिप्ट बनाएं। और इसमें, निष्पादित करने के लिए बस हमारे क्रोन को चलाएं:
echo "#!/system/bin/sh crond -b -L /sdcard/error.log -c /data/crontab" > /system/etc/init.d/99cronstart chmod 777 /system/etc/init.d/99cronstart reboot
डाउनलोड करने के बाद, जांचें कि क्या क्रोन शुरू हो गया है:
ps | grep crond root 414 1 9532 236 hrtimer_na 000dcf90 S crond
और हम अब समाप्त हो सकते हैं, लेकिन चलो एक मिनट प्रतीक्षा करें और देखें कि क्या हमारी फ़ाइल में कोई रिकॉर्ड था ... ठीक है, जैसा कि आप पहले से ही समझ गए थे, फिर से, कुछ भी काम नहीं किया। तथ्य यह है कि इस प्रक्रिया को सुपर उपयोगकर्ता से चलाने की आवश्यकता है।
99cronstart फ़ाइल में स्क्रिप्ट बदलें:
echo "#!/system/bin/sh /su/bin/su -c crond -b -L /sdcard/error.log -c /data/crontab" > /system/etc/init.d/99cronstart reboot
UPD : शायद आपके मामले में
su का एक अलग रास्ता होगा, फिर कमांड का उपयोग करें
जो su और आपके साथ पथ को प्रतिस्थापित करता है।
अब हमारा एंड्रॉइड डिवाइस क्रोन कार्यों का समर्थन करता है और इसमें स्वचालित लॉन्च के लिए शेल स्क्रिप्ट हो सकते हैं!
और अंत में, स्क्रिप्ट जो हमारे आवेदन को चलाएगी, अगर यह प्रक्रियाओं में नहीं है और हमारे आवेदन को लॉन्च करने से पहले मुख्य स्क्रीन पर क्या था, इसके बारे में जानकारी को बचाएगी:
proc=$(ps | grep "com.test.app") if [ "$proc" == "" ]; then dumpsys window | grep CurrentFocus > /sdcard/current_focus.dump sleep 1 am start -n com.test.app/com.test.app.activities.MainActivity fi