Score:0

บริการรายงาน Systemctl ล้มเหลวหลังจากผู้ใช้รีสตาร์ท Apache ด้วยตนเอง สามารถซิงค์ systemd และความจริงโดยไม่ต้องรีสตาร์ทกระบวนการได้หรือไม่

ธง ir

ฉันมีอินสแตนซ์ Apache ที่ขึ้นต้นด้วยหน่วย systemd ผู้ใช้หยุดและรีสตาร์ทอินสแตนซ์ด้วยตนเอง ตอนนี้ systemctl รายงานบริการว่า "ล้มเหลว" นอกเหนือจากการหยุดและรีสตาร์ท Apache มีวิธีใดที่จะทำให้ systemd รับรู้ได้ว่าบริการกำลังทำงานอยู่หรือไม่

นี่คือสถานะ (ฉันพยายามปกปิดข้อมูลบริษัท ดังนั้นหาก httpd-apache และ INT-1 ไม่สมเหตุสมผล เป็นเพราะฉันได้ลบส่วนหนึ่งของสตริงอักขระออก)

สถานะ $ systemctl httpd-apache-int-1.service
* httpd-apache.service - เซิร์ฟเวอร์ Apache HTTP สำหรับอินสแตนซ์ INT-1
   โหลดแล้ว: โหลดแล้ว (/usr/lib/systemd/system/httpd-apache-int-1.service; เปิดใช้งาน; การตั้งค่าล่วงหน้าของผู้ขาย: ปิดใช้งาน)
   ใช้งานอยู่: ล้มเหลว (ผลลัพธ์: exit-code) ตั้งแต่วันพุธที่ 2022-05-04 15:56:39 CDT; 2 วันที่ผ่านมา
     เอกสาร: ผู้ชาย:httpd(8)
           ผู้ชาย:apachectl(8)
 PID หลัก: 26914 (รหัส=ออก สถานะ=0/สำเร็จ)

นี่คือไฟล์หน่วยของฉัน

$ systemctl cat httpd-apache-int-1.service
# /usr/lib/systemd/system/httpd-apache-int-1.service
[หน่วย]
คำอธิบาย=เซิร์ฟเวอร์ Apache HTTP สำหรับอินสแตนซ์ INT-1
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[บริการ]
ประเภท = ส้อม
# ExecStart ไม่ใช่ "วิธี systemd" ในการทำสิ่งต่างๆ
#อาจมีปัญหาตามมาเช่นการวิ่งมากขึ้น
# มากกว่าหนึ่ง "systemctl ACTION httpd-apache-int-1"
#   ขณะนั้น. แต่ใช้สภาพแวดล้อม (ไฟล์) และ
# การแทนที่ systemd ไม่ได้ทำสิ่งที่ฉันต้องการ
ExecStart=/bin/sh -c '\
   ที่มา /etc/sysconfig/httpd.int-1 ; \
   ที่มา /opt/ca/webagent/ca_wa_env.sh ; \
   แหล่งที่มา /opt/apache/etc/int-1/WebAgent.conf ; \
   /usr/sbin/httpd $OPTIONS ; \
   ทางออก 0'
ExecReload=/bin/kill -USR1 ${MAINPID}
ExecStop=/bin/kill -WINCH ${MAINPID}
# เราต้องการให้ systemd ให้เวลา httpd เพื่อให้เสร็จสิ้นอย่างงดงาม แต่ก็ยังต้องการ
# it เพื่อฆ่า httpd หลังจาก TimeoutStopSec หากมีข้อผิดพลาดระหว่าง
#หยุดอย่างสง่างาม โดยปกติแล้ว Systemd จะส่งสัญญาณ SIGTERM ทันทีหลังจาก
# ExecStop ซึ่งจะฆ่า httpd เรากำลังส่ง SIGCONT ที่ไร้ประโยชน์มาที่นี่เพื่อมอบให้
# httpd เวลาที่จะเสร็จสิ้น
KillSignal=SIGCONT
PrivateTmp=จริง

[ติดตั้ง]
WantedBy=multi-user.target

นี่คือกระบวนการที่กำลังทำงานอยู่

$ ps -ef | grep [i]nt-1
อาปาเช่ 1030 27237 0 14:30 ? 00:00:01 /usr/sbin/httpd -k start -f /opt/apache/etc/int-1/httpd.conf
อาปาเช่ 3291 27237 0 พฤษภาคม05 ? 00:00:12 /usr/sbin/httpd -k start -f /opt/apache/etc/int-1/httpd.conf
อาปาเช่ 9974 27237 0 พฤษภาคม05 ? 00:00:15 /usr/sbin/httpd -k start -f /opt/apache/etc/int-1/httpd.conf
ราก 27237 1 0 พ.ค.47 ? 00:00:05 /usr/sbin/httpd -k start -f /opt/apache/etc/int-1/httpd.conf
อาปาเช่ 27239 1 0 พ.ค.47 ? 00:07:00 LLAWP /opt/apache/etc/int-1/WebAgent.conf -APACHE24
อาปาเช่ 27261 27237 0 พฤษภาคม 04 ? 00:00:41 /usr/sbin/httpd -k start -f /opt/apache/etc/int-1/httpd.conf
อาปาเช่ 27262 27237 0 พฤษภาคม 04 ? 00:00:37 /usr/sbin/httpd -k start -f /opt/apache/etc/int-1/httpd.conf

ข้อมูลอื่น ๆ ที่อาจเป็นประโยชน์

อาปาเช่
เวอร์ชันเซิร์ฟเวอร์: Apache/2.4.6 (Red Hat Enterprise Linux)

ระบบปฏิบัติการ
Red Hat Enterprise Linux Server รีลีส 7.9 (Maipo)

$ systemctl -- รุ่น
ระบบd 219
user10489 avatar
nc flag
คำตอบสั้น ๆ : ไม่ แต่คุณสามารถเพิกเฉยได้เช่นกัน แต่ทำไมไม่เริ่มใหม่
Marco avatar
in flag
อาจใช้ pidfile ที่ systemd ตรวจสอบ?
Marco avatar
in flag
อาจเป็นเพราะการเริ่มต้นเซิร์ฟเวอร์ apache ที่ซับซ้อน systemd ไม่พบ pid ที่ถูกต้องของกระบวนการ apache หลัก (เช่นใช้ pid ของ "/bin/sh")
iAmJeff avatar
ir flag
@user10489 ระบบการผลิต การรีสตาร์ทต้องได้รับการอนุมัติจากผู้มีส่วนได้ส่วนเสีย เกี่ยวกับ "คำตอบสั้น ๆ : ไม่" แดง ฉันหวังว่าจะมีเคล็ดลับ systemd
iAmJeff avatar
ir flag
@Marco pidfile เป็นไฟล์ที่กำหนดไว้ใน httpd.conf ดังนั้น "ควร" เป็นไฟล์เดียวกัน ฉันจำได้ว่าเห็นว่า PID ตรงกับกระบวนการของมนุษย์จริง ๆ เมื่อทำ "ps -ef | grep [a]pache"
Marco avatar
in flag
@iAmJeff systemd มีการจัดการ pid ของตัวเอง ตรวจสอบกระบวนการเริ่มต้นและพยายามค้นหา pid สิ่งนี้ไม่ขึ้นอยู่กับสิ่งที่เขียนในไฟล์ปรับแต่งของ httpdเปรียบเทียบ pids จาก `systemctl status httpd-apache-int-1` กับ pid ของ httpd
iAmJeff avatar
ir flag
@Marco คุณพูดถูก! ดูข้อมูลในคำถามของฉัน 26914 จากเอาต์พุตสถานะไม่ตรงกับ 27237 ที่แสดงโดย ps ไม่มีวิธีที่ง่ายในการซิงโครไนซ์หรือไม่? (ฉันไม่ต้องการแก้ไขพื้นที่หน่วยความจำของกระบวนการที่กำลังทำงานอยู่)
Marco avatar
in flag
คุณกำลังใช้ systemd ในทางที่ไม่ได้ผล ดูเหมือนว่าคุณยังคงติดอยู่ในความคิด `init.d` ดีที่สุด เขียนสคริปต์ `init.d` สำหรับสิ่งนี้และปล่อยให้ systemd สร้างส่วนที่เหลือ
iAmJeff avatar
ir flag
@Marco "... ให้ systemd สร้างส่วนที่เหลือ" คุณมีลิงค์หนึ่งหรือสองลิงค์พร้อมคำแนะนำหรือไม่?
iAmJeff avatar
ir flag
@Marco เกี่ยวกับหนึ่งในโพสต์ก่อนหน้าของคุณ คุณสามารถแบ่งปันชื่อหรือตำแหน่งของ pidfile ที่ systemd ตรวจสอบได้หรือไม่
Marco avatar
in flag
ฉันไม่ใช่ผู้พัฒนา systemd ฉันไม่รู้รายละเอียดภายใน Systemd ไม่ตรวจสอบไฟล์ pid ยกเว้นว่าคุณใช้ตัวเลือก `PIDFile=` สำหรับแต่ละสคริปต์ `init.d` systemd จะสร้างบริการหลอกขึ้นภายใน ซึ่งคุณสามารถจัดการได้ด้วย `systemctl` แบบเดียวกับบริการ systemd ดั้งเดิม (ดูที่ `man systemd-sysv-generator`) หากคุณสร้างบริการ systemd ที่ซับซ้อน คุณต้องศึกษาคู่มือ systemd (https://www.freedesktop.org/software/systemd/man/) ฉันสามารถสร้างคำตอบที่แก้ปัญหาของคุณได้อย่างแน่นอน แต่จะดีกว่าถ้าคุณเรียนรู้ไว้สำหรับปัญหาในอนาคต
Marco avatar
in flag
ในกรณีที่ดีที่สุด คุณต้องเปลี่ยนหนึ่งบรรทัด: ใส่ `exec` หน้า `/usr/bin/httpd`

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา