איך להפסיק sub process בתוך קונטיינר ב-docker בצורה נכונה?
-
שלום
בחברה אצלנו משתמשים ב-docker שנמצא על מחשב יוניקס (יובונטו)
באחד הקונטיינרים יש מערכת לתיזמון משימות (task scheduler), שנקרא Cronicle. (לקוח מהקוד הפתוח https://github.com/jhuckaby/Cronicle)
בגדול זה עובד בסדר, רק שנתקלתי בבעיה אחת - שאם אני רוצה להפסיק task באמצע הריצה שלו, ולוחצת על abort, הוא אמנם נעלם מהרשימה של המשימות שכרגע רצות. אבל אם אני מריצה פקודה לראות איזה פרוססים רצים בקונטיינר, הוא עדיין קיים ולא הפסיק.
יש רעיון איך נכון לטפל בבעיה הזאת?
כנראה שהסיגנל שנשלח הוא לא הנכון כדי להפסיק את הפרוסס (מדובר על JAR שרץ ע"י ג'אווה).
איזה סינגל נכון לשלוח כדי להפסיק אותו?
האם כדאי לשנות את הקוד של Cronicle אצלנו?
או אולי פיתרון כזה (שלא ממש הבנתי): https://www.shellscript.sh/trap.html
תודה מראש -
אני לא מכיר את הספריה הזו.
אבל מהלשון "אני לוחצת" נשמע שזה ממשק מוכן שלא בניתם, ויש לך רק ממשק משתמש ידידותי ללא log או משהו בסגנון.
זה ממשק מוכן שלהם? יש כתובת בה אפשר לשלוט דרך הדפדפן בtask?אני גם ממלית לך לפתוח issues פה: https://github.com/jhuckaby/Cronicle/issues
אם לא יועיל לא יזיק ולדעתי יועיל כי זה נראה פרוייקט עם פעילות.תכתבו קודם את השאלה בתמצות ממש: לחיצה על abort (אם זה גם בממשק התכנותי אז פקודת abort_job), לא סוגרת את התהליך (והוא ממשיך לרוץ או מושהה? בדקו זאת ע"י ps aux בעמודה stat).
אחרי זה תתכתבו את הרקע: 1. רץ על docker, 2 שרץ באובנטו. התהליך הוא יישום JAVA.מדי דברי אני רואה שלא בטוח שהם תומכים בכלל בdocker שכן יש להם issues פתוח על זה: Add docker support #4
-
תודה על התגובה
אכן יש להם ממשק שלהם שדרכו אני לוחצת
מקריאת ה-issue הפתוח בלינק שהבאת, נראה שאין להם שום מושג בקשר לתמיכה ב-docker
מבחינתי אין לי בעיה להיכנס לקוד שמועתק אלינו ולשנות/להכניס תיקון
השאלה איזה פקודה אני צריכה להריץ כדי שיהרוג את הפרוסס שנמצא בתוך הקונטיינר. נראה שיש כמה סוגי סיגנלים לשלוח, ואולי הם לא משתמשים בסיגנל הנכון.
בכל מקרה גם אכניס שם שאלה. -
אוקיי מצאתי פיתרון פשוט וקל, רושמת פה למקרה שיעזור למישהו
ה-cronicle לא הריץ את ה-jar ישירות, אלא היה לי shell שהריץ אותו
ה-abort עצר את ה-shell אבל ה-shell לא עצר את הג'אווה.
כדי לגרום לג'אווה למות כאשר הshell מת, צריך להריץ את הג'אווה בתוספת הפקודה exec
לדוגמא: exec java -jar MyProgram.jar
ואז לא נוצר לג'אווה פרוסס משל עצמו, אלא החיים שלו נכנסים לתוך החיים של הshell
קרדיט ל:
http://perfspy.blogspot.com/2015/02/trap-killing-signals-inside-docker.html