ฉันอยู่ในสถานการณ์ที่เชฟอาจเริ่มให้บริการ (postgres) แต่ในภายหลังอาจหยุดสายนอก ฉันต้องการให้พ่อครัวคนต่อไปทำงานเพื่อให้บริการทำงาน ฉันได้ลองสิ่งนี้แล้ว:
service "postgresql" do
action :start
end
แต่มันไม่มีผลใด ๆ การพูดอย่าง(up to date)
น่าจะเป็นเพราะเชฟรู้ว่ามันเริ่มแล้วและไม่สามารถบอกได้ว่ามันหยุดแล้ว (อาจเป็นเพราะservice ... status
พฤติกรรมการใช้บริการนี้ได้อย่างไร) ถ้าฉันเขียนสิ่งนี้:
# anti-pattern warning!
execute "force-start-postgresql" do
command "service postgresql start || /etc/init.d/postgresql start"
action :run
end
ฉันได้รับพฤติกรรมที่ต้องการ ยังaction :restart
ทำให้มันทำงาน อย่างไรก็ตามสิ่งเหล่านี้ดูเหมือนจะเป็นรูปแบบการต่อต้านเนื่องจากการพกพา (และอาจหยุดมันก่อนที่จะเริ่มอีกครั้งในกรณีหลัง)
ดังนั้นฉันจะบอกเชฟให้บังคับใช้บริการได้อย่างไรแม้ว่ามันจะคิดว่ามันกำลังทำงานอยู่แล้ว
นี่คือการใช้ Chef 11.6 โฮสต์โดย OpsCode และสูตร postgresql เริ่มต้น (หมายเหตุสิ่งนี้คล้ายกัน แต่ฉันคิดว่าไม่เหมือนกันกับวิธีการบังคับให้ดำเนินการกับทรัพยากร "ทันสมัย" ใน Chef? )
--- แก้ไข (ชี้แจงต่อไปนี้ jtimberland โพสต์) ---
-l debug
นี่แสดงให้เห็นว่า:
DEBUG: service[postgresql] supports status, running
DEBUG: service[postgresql] is running
แม้ว่ามันจะไม่ทำงาน นั่นฟังดูเหมือนแมลงตัวหนึ่งและฉันสนใจสิ่งนั้น อย่างไรก็ตามในขั้นต้นฉันสนใจว่ามีวิธีการบอกเชฟหรือไม่ "เรียกใช้คำสั่งเริ่มบริการเสมอโดยข้ามการตรวจสอบสถานะ" นั่นคือคำถามที่นี่
(ฉันไม่ใช่ผู้เชี่ยวชาญ แต่ฉันคิดว่าวิธีพกพาที่สุดในการตรวจสอบให้แน่ใจว่าบริการกำลังทำงานอยู่เพื่อเริ่มบริการและนั่นก็คือ idempotent เกือบตลอดเวลา OTOH ตรวจสอบว่าบริการทำงานไม่สอดคล้องกันหรือไม่และทำไมเราไม่สนใจ !)
:start
ไม่คำนึงถึง:status
ของ นอกจากนี้ฉันหวังว่ามันจะps -ef | grep [p]ostgresql
คล้ายหรืออย่างอื่นมันมักจะตรงกับคำสั่ง grep ของตัวเองและทำให้คิดว่าบริการกำลังทำงานอยู่เสมอ (หรืออาจเป็นปัญหาพื้นฐาน)