פורסם: 05/09/2015 - 17:46
נושא ההודעה: הרצת סקריפט כ-daemon תחת systemd
|
הפצת הסטריימר שלי משתמשת ב-systemd, אני צריך להריץ סקריפט בעלייה שירוץ ברקע.
כשאני מנסה להפעיל את service דרך systemd, הפקודה נתקעת אני צריך ללחוץ ctrl+c בשביל להמשיך, אם אני מנסה לעלות את המערכת מאפס, היא נתקעת בעליה כשהיא מעלה את daemon שלי.
זה קובץ ה-service שאני מתשמש בו כרגע:
קוד: |
[Unit]
Description=load external storage mounts
ConditionFileIsExecutable=/storage/external_storage_mount.sh
[Service]
Type=oneshot
ExecStart=/storage/external_storage_mount.sh
[Install]
WantedBy=multi-user.target |
יש למישהו רעיון איך לפתור את זה?
|
|
חזרה לתוכן הדיון |
פורסם: 05/09/2015 - 18:24
נושא ההודעה:
|
יש לי הרגשה שזו לא הדרך הנכונה. נראה לי שרצוי להחליף את היחידה הזו ביחידה מסוג mount. כלומר, במקום סיומת service, להשתמש בסיומת mount. ר' תיעוד על systemd.mount .
|
|
חזרה לתוכן הדיון |
פורסם: 05/09/2015 - 19:00
נושא ההודעה:
|
צפריר : | יש לי הרגשה שזו לא הדרך הנכונה. נראה לי שרצוי להחליף את היחידה הזו ביחידה מסוג mount. כלומר, במקום סיומת service, להשתמש בסיומת mount. ר' תיעוד על systemd.mount . |
אבל זה סקריפט, הוא לא רק מעגן ומסיר עיגון, הוא גם בודק תנאים לדעת לבצע אותם.
המידע שאני רוצה לעגן אמור להיות מעוגן ב-nfsv4, להפצה הזאת יש תמיכה בקרנל לזה אבל לא ב-userspace, ככה שצריך להישתמש במאגר לא רישמי ולא ניתן להגדיר ל-systemd מיקום אלטרנטיבי לחיפוש ה-util הרלוונטי כי המערכת הראשית היא RO.
מה עוד ששמתי לב ש-systemd לא מזהה לי stale nfs handlers ולא יודעת להסיר עיגון או לבצע אותו מחדש.
ככה שאני צריך לעשות את זה לבד.
|
|
חזרה לתוכן הדיון |
פורסם: 06/09/2015 - 08:56
נושא ההודעה:
|
אני לא יודע אם זה יעזור לך , אבל משהוא דומה היה לי לא מזמן בהקשר של מערכת קבצים על fuse.
הפתרון שלי היה :
1. פירוק הservice לשתיים (mount + service)
2. הוספה של RemainAfterExit=yes תיקון fstab שיהיה _netdev באופציות עגינה, ו
After=network.target remote-fs.target בתסריט העגינה.
שים זמן כשזה נראה "תקוע" אם מדובר על כ 60 שניות יש סיכוי טוב שתלות מסויימת (של הטסריט) לא עלתה (במקרה שלי זה היה network.target) , קלאסי זה בקשת הזדהות ו חוסר רשת.
RemainAfterExit=yes : אומר תתן להתליך להשאר רץ אחרי יציאה.
_netdev: מגדיר את אפשרות העגינה כ remote-fs
after= מגדיר שהסרביס יעלה אחרי המטרות האלה.
נ.ב. זה לא יעזור לך אם יש לך two factor auth או הזדהות דרך ממשק וובי
|
|
חזרה לתוכן הדיון |
פורסם: 06/09/2015 - 09:30
נושא ההודעה:
|
shtrb offline : | אני לא יודע אם זה יעזור לך , אבל משהוא דומה היה לי לא מזמן בהקשר של מערכת קבצים על fuse.
הפתרון שלי היה :
1. פירוק הservice לשתיים (mount + service)
2. הוספה של RemainAfterExit=yes תיקון fstab שיהיה _netdev באופציות עגינה, ו
After=network.target remote-fs.target בתסריט העגינה.
שים זמן כשזה נראה "תקוע" אם מדובר על כ 60 שניות יש סיכוי טוב שתלות מסויימת (של הטסריט) לא עלתה (במקרה שלי זה היה network.target) , קלאסי זה בקשת הזדהות ו חוסר רשת.
RemainAfterExit=yes : אומר תתן להתליך להשאר רץ אחרי יציאה.
_netdev: מגדיר את אפשרות העגינה כ remote-fs
after= מגדיר שהסרביס יעלה אחרי המטרות האלה.
נ.ב. זה לא יעזור לך אם יש לך two factor auth או הזדהות דרך ממשק וובי |
כפי שאמרתי, אני לא יכול לשנות את fstab כי המערכת מותקנת על מחיצה שהיא ro.
מעבר לזה, התקיעה מתרחשת גם כשהמערכת למעלה ואין שם תלויות כשאני מריץ את זה משורת פקודה.
כמוכן, אני לא יכול לפרק את זה כי אין לי איך להבהיר ל-mount איפה לחפש את mount.nfs4 מאותה סיבה שאני לא יכול לשנות את fstab.
|
|
חזרה לתוכן הדיון |
פורסם: 06/09/2015 - 09:43
נושא ההודעה: נראה שהתסריטים שלך שוכחים לצאת :)
|
כאשר מערכת עולה, כל תסריט צריך לדווח על מידת ההצלחה שלו. אם אתה לא יוצא עם exit 0 אז יש מצב שהמערכת עדיין מחכה לפלט ממך. (קלט מבחינתה).
לא בדקתי עם זה עם הסיסטמד, אבל הייתי בודק בכיון.
|
|
חזרה לתוכן הדיון |
פורסם: 06/09/2015 - 10:18
נושא ההודעה:
|
מהם התנאים שהסקריפט בודק? האם חלק מהם הם מידע שזמין ל־systemd? אם כן, אפשר לכתוב את זה כחלק מההגדרות.
|
|
חזרה לתוכן הדיון |
פורסם: 06/09/2015 - 10:57
נושא ההודעה: Re: נראה שהתסריטים שלך שוכחים לצאת :)
|
רם און : | כאשר מערכת עולה, כל תסריט צריך לדווח על מידת ההצלחה שלו. אם אתה לא יוצא עם exit 0 אז יש מצב שהמערכת עדיין מחכה לפלט ממך. (קלט מבחינתה).
לא בדקתי עם זה עם הסיסטמד, אבל הייתי בודק בכיון. |
הבעיה שלי היא ש-systemd מנסה להריץ את הסקריפט שלא כ-daemon אלא כסקריפט וצריך להריץ אותו כ-daemon כי יש לו לולאה אין סופית.
אני יכול לדאוג שהלולאה תהיה בתוך פונקציה ותורץ כהליך נפרד ואז זה עובד אבל במקרה הזה אני לא יכול לשלוט בסגירת ההליך.
יכול להיות שיש לי טעות באיך אני טופס את סיגנל כי אם אני שולח לו במקרה הזה סיגנל 15, הוא אכך סוגר את הקובץ אבל לא מבצע ניקיונות.
אנסה לחפש איך מבצעים תפיסת סיגנלים במקרה של הליך נפרד.
|
|
חזרה לתוכן הדיון |
פורסם: 06/09/2015 - 11:02
נושא ההודעה:
|
צפריר : | מהם התנאים שהסקריפט בודק? האם חלק מהם הם מידע שזמין ל־systemd? אם כן, אפשר לכתוב את זה כחלק מההגדרות. |
אינני יודע, הסקריפט די פשוט, כל 5 שניות הוא בודק האם קיים פרוטוקול nfs על השרת, אם כן הוא מנסה לעגן את הספריה הראשית של הסרבר (אם יש צורך) ואז מעגן את שאר הספריות כ-bind (עם צריך).
אם לא קיים הפרוטוקול, אז כל הסיפריות שעוגנו ולא שוחררו משוחררות בכוח.
|
|
חזרה לתוכן הדיון |
פורסם: 06/09/2015 - 11:14
נושא ההודעה: Re: נראה שהתסריטים שלך שוכחים לצאת :)
|
WobnI - work : | רם און : | כאשר מערכת עולה, כל תסריט צריך לדווח על מידת ההצלחה שלו. אם אתה לא יוצא עם exit 0 אז יש מצב שהמערכת עדיין מחכה לפלט ממך. (קלט מבחינתה).
לא בדקתי עם זה עם הסיסטמד, אבל הייתי בודק בכיון. |
הבעיה שלי היא ש-systemd מנסה להריץ את הסקריפט שלא כ-daemon אלא כסקריפט וצריך להריץ אותו כ-daemon כי יש לו לולאה אין סופית.
|
RemainAfterExit=yes ו oneshot
|
|
חזרה לתוכן הדיון |
פורסם: 06/09/2015 - 11:15
נושא ההודעה: Re: נראה שהתסריטים שלך שוכחים לצאת :)
|
Anonymous : | WobnI - work : | רם און : | כאשר מערכת עולה, כל תסריט צריך לדווח על מידת ההצלחה שלו. אם אתה לא יוצא עם exit 0 אז יש מצב שהמערכת עדיין מחכה לפלט ממך. (קלט מבחינתה).
לא בדקתי עם זה עם הסיסטמד, אבל הייתי בודק בכיון. |
הבעיה שלי היא ש-systemd מנסה להריץ את הסקריפט שלא כ-daemon אלא כסקריפט וצריך להריץ אותו כ-daemon כי יש לו לולאה אין סופית.
|
RemainAfterExit=yes ו oneshot |
ניסיתי, נתקע באותה מידה
|
|
חזרה לתוכן הדיון |
פורסם: 06/09/2015 - 11:20
נושא ההודעה:
|
איך הוא בודק האם קיים פרוטוקול nfs על השרת? מה יוכל להפריע לזמינות?
מעבר לכך, יכול להיות שהסקריפט הזה יכול להיות "שירות" שיספר ל־systemd מתי שהוא מוכן. כלומר ליצור יחידה מסוג (Type) notify וכשהכול מוכן לאותת ל־systemd בעזרת systemd-notify.
ואז אפשר להשתמש בכלים הרגילים (יחסית) לכל שאר ה־mounts. כל מה שצריך לדאוג הוא שהיחידות שלה יהיו After השירות שלך (אם אני מבין נכון איך שזה עובד).
|
|
חזרה לתוכן הדיון |
פורסם: 06/09/2015 - 13:59
נושא ההודעה:
|
צפריר : | איך הוא בודק האם קיים פרוטוקול nfs על השרת? מה יוכל להפריע לזמינות? |
rpcinfo addr nfs מחזיר הם יש לשרת nfs פתוח.
בעית זמינות? אני מכבה את השרת.
צפריר : |
מעבר לכך, יכול להיות שהסקריפט הזה יכול להיות "שירות" שיספר ל־systemd מתי שהוא מוכן. כלומר ליצור יחידה מסוג (Type) notify וכשהכול מוכן לאותת ל־systemd בעזרת systemd-notify. |
אוקי, מה אני יכול לעשות במקרה של קבלת הודעה?
צפריר : |
ואז אפשר להשתמש בכלים הרגילים (יחסית) לכל שאר ה־mounts. כל מה שצריך לדאוג הוא שהיחידות שלה יהיו After השירות שלך (אם אני מבין נכון איך שזה עובד). |
הפקודה הבאה לא עובדת שלי:
קוד: | mount 't nfs4 10.0.0.1:/storage /storage/nfs_mnt |
אני לא רואה דרך איך לגרום ל-systemd לדעת איפה יושב הקובץ הרצה.
|
|
חזרה לתוכן הדיון |
פורסם: 06/09/2015 - 14:16
נושא ההודעה:
|
יכול להיות שזה וריאציה של https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/1430280
האם תוכל בבקשה להריץ :
systemctl show -p Wants -p After something.service
כאשר something זה שם הסרביס הנוכחי ?
|
|
חזרה לתוכן הדיון |
פורסם: 06/09/2015 - 14:19
נושא ההודעה:
|
תתעלם אמרת שניסית להרים גם לאחר שקיבלת tty
|
|
חזרה לתוכן הדיון |
פורסם: 06/09/2015 - 18:45
נושא ההודעה:
|
מי שמריץ את הפקודה זה לא systemd ישירות אלא mount. הפקודה שהוא מריץ היא:
דאג שזה יצביע על התוכנית שלך (ולו בעזרת dpkg-divert).
|
|
חזרה לתוכן הדיון |
פורסם: 06/09/2015 - 21:40
נושא ההודעה:
|
צפריר : | מי שמריץ את הפקודה זה לא systemd ישירות אלא mount. הפקודה שהוא מריץ היא:
דאג שזה יצביע על התוכנית שלך (ולו בעזרת dpkg-divert). |
אני כבר לא יודע איך להגיד את זה, אין לי יכולת לכתוב לכל מקום במערכת הקבצים שזה לא תחת /storage כי היא read only.
|
|
חזרה לתוכן הדיון |
פורסם: 07/09/2015 - 02:11
נושא ההודעה: לוגים לוגים
|
קוד: | ExecStart=/bin/sh -c "/your/script/location/external_storage_mount.sh >> /your/path/to/wirtable/location/for/external_storage_mount.log 2>&1" |
תבדוק את האופציה הזו.
http://go2linux.garron.me/linux/2010/12/setsid-how-execute-commands-after-you-exit-shell-prompt-866/
|
|
חזרה לתוכן הדיון |
פורסם: 07/09/2015 - 10:45
נושא ההודעה:
|
אז איך יש לך אפשרות להתערב בכלל בתהליך העליה? איך אתה יכול להוסיף שירות אם אין לך יכולת לשנות את /etc ?
|
|
חזרה לתוכן הדיון |
פורסם: 07/09/2015 - 11:19
נושא ההודעה:
|
צפריר : | אז איך יש לך אפשרות להתערב בכלל בתהליך העליה? איך אתה יכול להוסיף שירות אם אין לך יכולת לשנות את /etc ? |
אתה יכול להגדיר ל-systemd מאיפה לקרוא עוד services
|
|
חזרה לתוכן הדיון |
פורסם: 09/09/2015 - 22:03
נושא ההודעה:
|
נראה שה-service הבא עובד:
קוד: | [Unit]
Description=load external storage mounts
ConditionFileIsExecutable=/storage/external_storage_mount.sh
[Service]
Type=fork
ExecStart=/bin/nohup /storage/external_storage_mount.sh
[Install]
WantedBy=multi-user.target
|
ידנית זה עובד, נשאר לי לבדוק רק boot.
|
|
חזרה לתוכן הדיון |
פורסם: 09/09/2015 - 22:09
נושא ההודעה:
|
עובד גם אחרי boot, תודה לכולם על העזרה.
|
|
חזרה לתוכן הדיון |
|