หัวหน้างานไม่โหลดไฟล์การกำหนดค่าใหม่


68

ฉันมีปัญหาในการปรับใช้แอพ Django โดยใช้ Gunicorn และ Supervisor ในขณะที่ฉันสามารถให้ Gunicorn ให้บริการแอปของฉัน (โดยการตั้งค่า PYTHONPATH ที่เหมาะสมและเรียกใช้คำสั่ง apropriate หนึ่งตัวจากการตั้งค่า supervisord) ฉันไม่สามารถทำให้หัวหน้างานเรียกใช้งานได้ มันจะไม่เห็นแอพของฉัน ฉันไม่ทราบวิธีการตรวจสอบให้แน่ใจว่าไฟล์ปรับแต่งนั้นใช้ได้

นี่คือสิ่งที่ supervisorctl พูดว่า:

# supervisorctl start myapp_live
myapp_live: ERROR (no such process)

ฉันใช้งานบน Ubuntu 10.04 ด้วยการกำหนดค่าต่อไปนี้:

ไฟล์ /home/myapp/live/deploy/supervisord_live.ini:

[program:myapp_live]
command=/usr/local/bin/gunicorn_django --log-file /home/myapp/logs/gunicorn_live.log --log-level info --workers 2 -t 120 -b 127.0.0.1:10000 -p deploy/gunicorn_live.pid webapp/settings_live.py
directory=/home/myapp/live
environment=PYTHONPATH='/home/myapp/live/eco/lib'
user=myapp
autostart=true
autorestart=true

ใน /etc/supervisor/supervisord.conf ที่ส่วนท้ายของไฟล์มี:

[include]
files = /etc/supervisor/conf.d/*.conf

และนี่คือ symlink ในไฟล์ config ของฉัน:

# ls -la /etc/supervisor/conf.d
lrwxrwxrwx 1 root root   48 Dec  4 18:02 myapp-live.conf -> /home/myapp/live/deploy/supervisord_live.ini

ทุกอย่างดูดีสำหรับฉัน แต่ supervisorctl พูดmyapp_live: ERROR (no such process)ต่อไปเรื่อย ๆ มีทางออกสำหรับเรื่องนี้ไหม?


ฉันเกาหัวของฉันด้วยปัญหาเดียวกัน; แฟ้มการกำหนดค่าของฉันไม่ได้ถูกโหลดเมื่อฉันวิ่งหรือreread updateมันกลับกลายเป็นว่าฉันได้บันทึกไฟล์กำหนดค่าของฉันfoo.conf.pyแทนfoo.confดังนั้นพวกเขาจึงไม่ถูกระบุ
Timmy O'Mahony

คำตอบ:


31

ฉันมีปัญหาเดียวกัน

sudo service supervisord reload

ทำกลอุบายแม้ว่าฉันจะไม่รู้ว่านั่นเป็นคำตอบสำหรับคำถามของคุณหรือไม่


2
ฉันหยุดแล้วก็เริ่มหัวหน้างานเมื่อไม่นานมานี้และมันใช้งานได้ ไม่ทราบว่าการรีโหลดจะใช้งานได้หรือไม่ (เพราะฉันเริ่มไม่ได้) แต่ฉันคิดว่ามันน่าจะเป็นไปได้
grucha

ฉันก็ทำเหมือนกันและมันก็ใช้ได้แล้ว ฉันสงสัยว่าทำไม/etc/init.d/supervisor restartไม่ทำงานเมื่อหยุดด้วยตนเองและเริ่มทำ
คิริลล์

1
ทำงานให้ฉันได้แม้ว่าบริการจะไม่ทำงานดังนั้นฉันจึงวิ่งps aux | grep supervisorแล้วsudo kill -HUP pid
Wayne Werner

2
สิ่งนี้มีอันตรายเนื่องจากจะรีสตาร์ท daemon ทั้งหมด
Mark Theunissen

7
ผู้ดูแลสามารถอ่านซ้ำได้โดยไม่ต้องเริ่มบริการใหม่
Jonathan Liuti

199

คำตอบที่ถูกต้องคือหัวหน้างานต้องการให้คุณอ่านและอัปเดตใหม่เมื่อคุณวางไฟล์กำหนดค่าใหม่ การเริ่มต้นใหม่ไม่ใช่คำตอบเนื่องจากจะมีผลกับบริการอื่น ๆ ลอง:

supervisorctl reread
supervisorctl update

13
นี่ควรเป็นคำตอบที่ถูกต้อง "ผู้บังคับบัญชาอ่านซ้ำ" เพียงอย่างเดียวไม่เพียงพอ
Miebster

3
+1 นี่เป็นคำตอบที่ดีกว่าเพราะไม่ได้พึ่งพาผู้จัดการกระบวนการ
tidwall

8
"supervisorctl reread" เพียงอย่างเดียวไม่เพียงพอ แต่จะไม่เพียงพอ "supervisorctl update" ใช่ไหม อ้างอิงถึงเอกสาร "update" ทำการอ่านซ้ำแล้วตามด้วยการรีสตาร์ทโปรแกรมใด ๆ ที่มีการแก้ไขการกำหนดค่าโดยการอ่านซ้ำ
BlueBomber

มันใช้งานได้สำหรับฉัน ฉันได้ทำการรีสตาร์ทในภายหลัง
user1012513

15

ตรวจสอบให้แน่ใจว่าไฟล์ผู้บังคับบัญชาของคุณลงท้ายด้วย. conf

เอาฉันไปสักพักเพื่อหาอันนั้น หวังว่ามันจะช่วยให้คนต่อไป


1
เสียเวลาหนึ่งชั่วโมงในเรื่องเดียวกัน - ไม่น่าเชื่อว่ามันง่ายขนาดนี้
Zane Hooper

1
ขอบคุณสำหรับรายการคำตอบนี้ สำหรับชีวิตของฉันฉันไม่สามารถคิดออกนี้
Phillip Martin

14

การโหลดกระบวนการหัวหน้างานใหม่อาจทำงานได้ แต่จะมีผลข้างเคียงที่ไม่ได้ตั้งใจหากคุณมีกระบวนการมากกว่าหนึ่งกระบวนการที่ถูกตรวจสอบโดยหัวหน้างาน

วิธีที่ถูกต้องที่จะทำคือการออกsupervisorctl rereadซึ่งทำให้มันสแกนไฟล์การกำหนดค่าสำหรับการเปลี่ยนแปลงใด ๆ :

root@debian:~# supervisorctl reread
gunicorn: changed

จากนั้นให้โหลดแอปนั้นอีกครั้ง:

root@debian:~# supervisorctl restart gunicorn
gunicorn: stopped
gunicorn: started

นี่เป็นทางออกที่ดีที่สุดหากคุณต้องการอ่านไฟล์กำหนดค่าที่เปลี่ยนแปลง / ใหม่เท่านั้นและปล่อยให้กระบวนการที่เหลือทำงานอยู่โดยไม่มีการแตะต้อง Supervisorctl availจะแสดงแอปใหม่เป็น เพิ่มไปยังกระบวนการที่สามารถเริ่มต้นได้อีกครั้งโดยการsupervisorctl updateออก ดูเพิ่มเติมคำตอบของ Mark serverfault.com/a/479754/125887
Sjaak Trekhaak

4
มันไม่เพียงพอสำหรับฉัน supervisorctl updateมีความจำเป็น
Yaroslav Nikitenko

5

ฉันพบปัญหานี้โดยใช้แพ็คเกจผู้ดูแลระบบเวอร์ชัน 3.0a8-1.1 จาก Ubuntu Server 12.10 ฉันสิ้นสุดการแก้ไขปัญหาด้วยการอ่านความช่วยเหลือในตัว:

$ sudo supervisorctl help restart
restart <name>          Restart a process
restart <gname>:*       Restart all processes in a group
restart <name> <name>   Restart multiple processes or groups
restart all             Restart all processes

โดยเฉพาะอย่างยิ่งคุณต้องการใช้ไวยากรณ์:

sudo supervisorctl restart myapp_live:*

เนื่องจากเอกสารประกอบระบุไว้ที่http://supervisord.org/configuration.html#programx-section - "ส่วน [โปรแกรม: x] จริง ๆ แล้วหมายถึง" กลุ่มกระบวนการที่เป็นเนื้อเดียวกัน "ถึงผู้บังคับบัญชา (จาก 3.0)" ดังนั้นปัญหาอาจเกิดขึ้นครั้งแรกในรุ่น 3.0

PS: ฉันใหม่สำหรับผู้บังคับบัญชา; ฉันใช้https://github.com/bdarnell/tornado-production-skeleton/blob/8ad055457646929c0e8f48aaf20d98f054b1787b/production/chat.supervisorเป็นตัวอย่างของการกำหนดค่าขั้นต่ำที่ควรมีลักษณะ


4

ฉันมีปัญหาที่คล้ายกัน ( myapp_live: ERROR (no such process)) และเป็นเพราะคำจำกัดความกระบวนการของฉันคือ

[program: myapp_live]

เมื่อมันควรจะเป็น

[program:myapp_live]

แม้ว่าสิ่งนี้จะไม่ตอบคำถามที่ถูกถาม แต่ฉันก็เป็นผู้นำในการค้นหาที่กำลังมองหาวิธีการแก้ไขปัญหาของฉันดังนั้นหวังว่าคนอื่นจะพบได้ที่นี่เช่นกัน


กันที่นี่! ฉันทิ้งมันไว้อย่าง[program]เดียวติดตามเอกสาร แต่ทำให้[program:redis]มันใช้ได้สำหรับฉัน สิ่งที่แน่ใจว่าได้รับแปลกเวลา!
ankush981

2

ฉันพบว่าวิธีนี้สะดวกที่สุด:

แก้ไข: ก่อนที่จะทำสิ่งนี้ให้ตรวจสอบเส้นทาง supervisorctl ของคุณที่ใช้which supervisorctlเพื่อให้แน่ใจว่าคุณกำลังเพิ่มเส้นทางที่ถูกต้องไปยัง sudoers

เพิ่มบรรทัดนี้ลงในไฟล์ sudoers โดยใช้visudo(โดย: myappuser- ผู้ใช้ที่ต้องการรีสตาร์ทแอปของคุณmyapp- ชื่อแอพ):

myappuser  ALL=(ALL) NOPASSWD: /usr/bin/supervisorctl restart myapp

แล้วก็:

sudo supervisorctl restart myapp

คุณไม่ได้ผูกติดกับสคริปต์เริ่มต้นของการแจกจ่ายและคุณให้สิทธิ์ผู้ใช้ในการรีสตาร์ทแอพ gunicorn ของคุณ นอกจากนี้คุณไม่จำเป็นต้องสนใจ pid คำสั่งจะไม่ถามรหัสผ่านดังนั้นจึงเหมาะสำหรับสคริปต์การปรับใช้ bash / fabric โดยอัตโนมัติ ในทางกลับกัน - คุณต้องระวังว่าถ้า supervisorctl มีความเสี่ยงต่อข้อผิดพลาดบางอย่างที่ทำให้เกิดการเรียกใช้รหัสผู้ใช้ที่เป็นอันตรายสามารถใช้สิทธิ์ sudo นี้เพื่อเรียกใช้รหัสเป็นราก (แต่เท่าที่ฉันรู้ว่าไม่มีข้อผิดพลาดดังกล่าว มันเป็นเรื่องใหญ่ที่จะพบช่องโหว่ดังกล่าว)


2

อ่านรหัสของ supervisorctl.py ที่นี่: https://github.com/Supervisor/supervisor/blob/master/supervisor/supervisorctl.py

คุณสามารถเห็นได้ว่าการปรับปรุง supervisorctl (ฟังก์ชั่น do_update) กำลังเรียก reloadConfig () เหมือนกันกับ supervisorctl reread (ฟังก์ชัน do_reread) ทำ

ดังนั้นฉันคิดว่าการเรียก reread นั้นไม่จำเป็นถ้าคุณเรียก update หลังจากนั้น

จากผลลัพธ์ของการตำหนิคอมไพล์มันเป็นแบบนี้มาตั้งแต่อย่างน้อยก็ตั้งแต่เดือนกรกฎาคม 2552


2

นี่คือรายการตรวจสอบ:

  1. ไฟล์กำหนดค่าใหม่ควรตั้งชื่อตามรูปแบบรวมที่กำหนดค่าใน /etc/supervisord.conf:

    [include]
    files=supervisord.d/*.ini
    

    อย่างที่เราเห็นในกรณีของฉันจะมีการรวม spam.ini แต่ spam.conf จะไม่รวมอยู่ด้วย

  2. หากคุณสร้างไฟล์ใหม่โดยการคัดลอกไฟล์เก่าอย่าลืมเปลี่ยน[program:]บรรทัด เพราะถ้าคุณโง่เหมือนมีสองไฟล์สำหรับโปรแกรมเดียวกันsupervisorctl rereadจะทำให้คุณมีข้อผิดพลาดที่สิ้นหวังเป็นการลงโทษ:

    No config updates to processes
    
  3. หากตรวจพบไฟล์ของคุณsupervisorctl rereadควรพูดดังนี้:

    spam: available
    
  4. จากนั้นทั้งสองควรจะเริ่มต้นมันและทำให้มันปรากฏในsupervisorctl update spamsupervisorctl status


1

ฉันพบว่าสคริปต์ init.d ไม่น่าเชื่อถือในรุ่นต่างๆของ Ubuntu / Debian วิธีที่จะทำคือ:

sudo supervisorctl reload

นี่ไม่ใช่วิธีที่ถูกต้องที่จะทำแม้ว่ามันจะใช้ได้ในหลาย ๆ สถานการณ์ @ burhan-khalid คำตอบเป็นคำตอบที่ถูกต้องและให้คำอธิบาย
glarrain

1

ระวังด้วย symlink และรวมไฟล์ไว้ใน Supervisor มันจะอนุญาตให้บุคคลที่มีสิทธิ์ w บน /home/myapp/live/deploy/supervisord_live.ini เปลี่ยนไฟล์ ini และเริ่มรหัสที่เป็นอันตรายใด ๆ ไฟล์ ini นี้ควรอยู่ในไดเรกทอรี conf ของหัวหน้างานหรือในส่วนย่อยใด ๆ


0

ฉันติดตั้ง supervisrod ด้วย yum install ซึ่งติดตั้ง supervisor ของเวอร์ชัน v2. * หัวหน้างานสนับสนุนการรวมภายนอกจากรุ่น 3 เท่านั้นต้องใช้ easy_install แทนเพื่อติดตั้ง supervisor v3


นี่เป็นปัญหาของฉันด้วยเช่นกันมันอาจจะเกิดขึ้นกับ Centos 6.5 หรือน้อยกว่าทั้งหมดที่ติดตั้ง
bearrito
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.