#281 Foreman
לאחרונה, ריאן בייטס שאל בטוויטר מה הדרך הטובה ביותר לנהל את תהליכי הרקע עליהם מתבססת אפליקציית ריילס בסביבת הפיתוח. מספר אנשים הציעו את פורמן (Foreman), וזה מה שנכסה בפרק זה.
לדוגמא, כדי להשתמש באפליקציית GoVsGo של ריאן בסביבת פיתוח, יש לפתוח מספר תהליכי רקע מבעוד מועד. תהליכים אלה כוללים לדוגמא את Beanstalkd, script/worker
וכמו כן גם תהליך שרת של אפליקציית Faye. יש לאתחל כל אחד מהתהליכים הללו בכל פעם בה רוצים להשתמש ב-GoVsGo בסביבת הפיתוח. כאן נכנס פורמן לתמונה, ומאפשר לנו לנהל בצורה פשוטה את כל תהליכי הרקע הללו.
התקנה ושימוש ב-פורמן
פורמן מסופק לנו כג'ם ומותקן בדרך הרגילה והמקובלת.
$ gem install foreman
פורמן קורא מתוך קובץ הנקרא Procfile
את רשימת התהליכים שעליו לנהל. הקובץ אמור להיות בתיקיית השורש של אפליקציית הריילס שלנו, כך שעלינו ליצור אותו. בקובץ זה נרשום את כל התהליכים שנרצה שפורמן ינהל. כל תהליך יזוהה באמצעות שם, לאחריו נקודותיים ואחריהן התהליך שאנו רוצים שיורץ, כך שנמלא את הקובץ באופן הבא:
beanstalk: beanstalkd worker: ./script/worker faye: rackup faye.ru -s thin -E production
לאחר שיצרנו את קובץ ה-Procfile
, אנו יכולים לבדוק את תקינותו על ידי הרצת הפקודהforeman check
.
$ foreman check valid procfile detected (beanstalk, worker, faye)
אם השתמשתם בטאב, במקום ברווח, על מנת להפריד את השמות מהפקודות בקובץ ההגדרה, תתקבל הודעה המזהירה מפני הפסקת התמיכה בפורמט זה. יש לקחת זאת בחשבון כאשר עורכים את קובץ ה-Procfile
. אם לאחר הרצת הפקודה אנו מקבלים חיווי כי הקובץ תקין, נוכל לנסות להריץ את פורמן על ידי הפקודה foreman start
.
$ foreman start 20:06:35 beanstalk.1 | started with pid 23140 20:06:35 worker.1 | started with pid 23141 20:06:35 faye.1 | started with pid 23143 20:06:36 faye.1 | >> Thin web server (v1.2.11 codename Bat-Shit Crazy) 20:06:36 faye.1 | >> Maximum connections set to 1024 20:06:36 faye.1 | >> Listening on 0.0.0.0:9292, CTRL+C to stop 20:06:38 worker.1 | [2011-08-29 20:06:38 +0100] Working 1 jobs: [ Game.move ]
כאשר נריץ את הפקודה, כל אחד מהתהליכים שהגדרנו בקובץ Procfile
יורץ ויירשם יחד עם הפלט שלו בחלון המסוף. אם נלחץ קונטרול+C
בחלון המסוף, כל אחד מהתהליכים יופסק.
לפורמן יש מדריך שימושי, המתעד את הפרמטרים שניתן להעביר לו וכן כמה מתכונותיו הנוספות, אותן נסקור כעת. לדוגמא, אם נרצה להריץ רק תהליך אחד מתוך התהליכים שהוגדרו בקובץ
$ foreman start faye 20:35:41 faye.1 | started with pid 23322 20:35:41 faye.1 | >> Thin web server (v1.2.11 codename Bat-Shit Crazy) 20:35:41 faye.1 | >> Maximum connections set to 1024 20:35:41 faye.1 | >> Listening on 0.0.0.0:9292, CTRL+C to stop
אם נרצה להריץ מספר עותקים שונים של תהליכי רקע, נוכל לעשות זאת באמצעות העברת הפרמטר -c
. לדוגמא, נוכל לאתחל 4 מופעים של worker על ידי הרצת הפקודה foreman start -c worker=4
.
$ foreman start -c worker=4 20:39:41 beanstalk.1 | started with pid 23366 20:39:41 worker.1 | started with pid 23368 20:39:41 worker.2 | started with pid 23370 20:39:41 worker.3 | started with pid 23372 20:39:41 worker.4 | started with pid 23374 20:39:41 faye.1 | started with pid 23376 20:39:42 faye.1 | >> Thin web server (v1.2.11 codename Bat-Shit Crazy) 20:39:42 faye.1 | >> Maximum connections set to 1024 20:39:42 faye.1 | >> Listening on 0.0.0.0:9292, CTRL+C to stop 20:39:46 worker.3 | [2011-08-29 20:39:46 +0100] Working 1 jobs: [ Game.move ] 20:39:46 worker.1 | [2011-08-29 20:39:46 +0100] Working 1 jobs: [ Game.move ] 20:39:46 worker.2 | [2011-08-29 20:39:46 +0100] Working 1 jobs: [ Game.move ] 20:39:47 worker.4 | [2011-08-29 20:39:47 +0100] Working 1 jobs: [ Game.move ]
הפקודה תגרום לפתיחת כל התהליכים פעם יחידה, פרט ל-worker אשר ייפתח ב-4 מופעים שונים.
ייצוא תהליכים
לפורמן יכולת לייצא את התהליכים בפורמט שניתן להשתמש בו בשרת בסביבת הייצור. נכון להיום הפורמטים הנתמכים הם inittab
ו-upstart
. אם נריץ את הפקודה foreman export upstart .
פורמן ייצור מספר קבצי הגדרות בפורמט upstart בתוך התיקייה הנוכחית. אם נבחן אחד מהן, נראה שהוא מריץ פקודה להתחלת תהליך של beanstalkd
וטיפול בלוגים.
start on starting govsgo-beanstalk stop on stopping govsgo-beanstalk respawn exec su - govsgo -c 'cd /Users/eifion/govsgo; export PORT=5000; beanstalkd >> /var/log/govsgo/beanstalk-1.log 2>&1'
עד כאן פרק זה על פורמן. הפרק היה קצר מהרגיל, היות ופורמן הוא פתרון פשוט לבעיה נקודתית, והוא עושה את עבודתו נאמנה. אם עליכם לפתוח מספר תהליכים שונים על מנת שאפליקציית הריילס שלכם תפעל בסביבת הפיתוח, כדאי לכם לשקול להשתמש בפורמן