על Cygwin עם crontab ועל Windows 2003

למי שלא מכיר, Cygwin היא מעין מערכת דומה ל-Linux שרצה על Windows (החל מ-Windows 98 ומעלה). היא מאפשרת להריץ תוכנות שנכתבו עבור מערכות יוניקס כמו לינוקס והודרו (Compiled) על Cygwin. התוכנה מאפשרת בעצם להנות מ-2 העולמות: גם Windows וגם “מעין” Linux ללא הפסד מהירות בביצועים. אין צורך להסתבך עם דרייברים או קרנל. מתקינים, מריצים.

השבוע הייתי צריך להריץ מספר דברים על Cygwin כאשר מצאתי שהמערכת שמריצה את ה-Cygwin באותו שרת זה Windows 2003, ואם יש משהו ש-Windows 2003 לא אוהב, זה שתוכנית משתמשת במשתמשים אחרים כדי להריץ סקריפטים, שזה בעצם מה ש-Crontab עושה, ו-Windows 2003 עושה את המוות לדברים כאלו.

אפשרי ב-cygwin להריץ את crontab בתור JOB, אך אם מפעילים את ה-CYGWIN מחדש, ה-JOB מת ויש צורך להפעיל אותו מחדש. אפשר להריץ את crontab גם כ-Service, אולם הגדרות המחדל של Windows 2003 ימנעו מ-crontab לרוץ נורמלי. בשביל זה הפתרון הר”מ.

לאחר שבזבזתי כמה שעות על כך, הצלחתי למצוא פתרון איך להריץ את Crontab בצורה של שרות (Service) על Windows 2003. להלן ההוראות:

  • התחבר ל-Windows בתור Administrator או משתמש בעל זכויות של Local Administrator לפחות.
  • פתח cygwin
  • לאחר מכן, יש להעתיק את הפקודות הבאות ישירות לקונסולה:

net user cron_server /add /yes
net localgroup Administrators cron_server /add
editrights -a SeAssignPrimaryTokenPrivilege -u cron_server
editrights -a SeCreateTokenPrivilege -u cron_server
editrights -a SeIncreaseQuotaPrivilege -u cron_server
editrights -a SeServiceLogonRight -u cron_server
mkpasswd -l -u cron_server >> /etc/passwd
editrights -a SeDenyInteractiveLogonRight -u cron_server
editrights -a SeDenyNetworkLogonRight -u cron_server
editrights -a SeDenyRemoteInteractiveLogonRight -u cron_server
cygrunsrv -I cron -p /usr/sbin/cron -a -D -d "Cygwin cron service" -e "CYGWIN=tty ntsec" -u cron_server –w XXXXX

  • אם שמת לב, בסוף הפקודות יש XXXXX – שם אמורה להיכנס הסיסמא של המשתמש עם הרשאות Local Administrator.
  • כל רשימת הפקודות האלו יוצרת משתמש בשם cron_server ומאפשרת לו להריץ את שרות crontab כ-service ב-Windows. אפשר לפתוח חלון services (ב-Windows אפשר ללחוץ על run ולכתוב: services.msc) ולוודא שהשרות רץ. אם לא, אפשר להתחיל אותו. הוא יתחיל אוטומטית בכל פעם שהמערכת תופעל מחדש.
  • אחד הבאגים המעצבנים שגיליתי הוא שגם כשהתחלת את השרות של cron, הסקריפטים ש-Cron אמור להריץ (מה שנמצא ב-crontab) לעיתים לא רצים והפתרון היחיד (והמגעיל) הוא פשוט לפתוח את רשימת הסקריפטים שהשרות אמור להריץ (ע”י פקודת crontab –e) ופשוט להוסיף איזה רווח ולשמור את הקובץ. (אפשר גם לעשות touch בתוך ספריית ה-cron שנמצאת ב-var/run/cron/ אבל זה קצת יותר מסובך).
  • כדי לבדוק שהכל כשר ורץ, משתמשים בפקודות: cronevents. משום מה כשמריצים crontab כ-Service, הוא לא מואיל בטובו לשמור את הלוגים ב-var/log/cron.log/. למה? שאלה טובה.

קרדיט כמובן מגיע למי שמגיע: כמובן שלא אני זה שמצא את כל הטריקים האלו, אלא היו אחרים ששברו את הראש על כך בעבר.

Comments

comments