การใช้ Cron เพื่อให้แน่ใจว่ากระบวนการพื้นหลังทำงานอยู่


1

ฉันพยายามเรียกใช้กระบวนการพื้นหลัง PHP ที่เป็นผู้บริโภคสำหรับข้อความ Rabbit MQ ฉันสามารถเรียกใช้สคริปต์ในชื่อ "php receive.php &" แต่ฉันต้องการให้แน่ใจว่าสคริปต์นี้ทำงานอยู่ตลอดเวลา

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

ฉันพยายามรัน Bash Script บน Cron ทุก ๆ ชั่วโมงเพื่อให้แน่ใจว่ากระบวนการพื้นหลังทำงานอยู่ แต่ฉันไม่ได้เปิดใช้งาน ถ้าฉันรัน Shell / Bash Script โดยตรง มันทำงานได้อย่างสมบูรณ์

Bash Script

p=$(pidof -s php receive.php)
if [[ -z "${p// }" ]]
        then php /var/www/html/example.com/public_html/receive.php &
        else echo 'Receive Already Running';
fi

บรรทัด Crontab -e

# m h  dom mon dow   command
0 * * * * /var/www/html/example.com/public_html/analytics.sh

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


ระบบ linux นี้ใช้ระบบ init อะไรได้บ้าง? (เช่น systemd, sysv, พุ่งพรวด, ... )
thrig

ทำไมต้องใช้cron? while true; do php receive.php; doneแน่นอนคำตอบคือจะเริ่มจากสคริปต์ที่ล้อมรอบด้วย การดำเนินการนี้จะเริ่มต้นใหม่ทันทีโดยไม่ต้องรอการcronสำรวจครั้งต่อไป
AFH

เราใช้ Ubuntu 16.04 LTS กับ PHP 7 เราใช้ systemd
user1732920

สวัสดี AFH ฉันเข้าใจว่าฉันสามารถเรียกใช้ receive.php เป็นกระบวนการพื้นหลังได้ แต่ฉันต้องตรวจสอบให้แน่ใจว่ามันทำงานอยู่เสมอ แม้หลังจากรีสตาร์ท apache หรือรีบูต Linux
user1732920

คำตอบ:


2

คุณสามารถสร้างเซอร์วิส systemd ที่รันสคริปต์ bash ของคุณ แต่สคริปต์ควรจะสามารถทำงานได้อย่างต่อเนื่อง

สร้างไฟล์ที่ / etc / systemd / system /

[Unit]
Description=Add a description here

[Service]
Type=simple
ExecStart=/var/www/html/example.com/public_html/analytics.sh
Restart=always

[Install]
WantedBy=multi-user.target

เรียกใช้systemctl daemon-reloadแล้วsystemctl start SERVICENAME

หรือ

ถ้ากระบวนการที่คุณต้องการในการตรวจสอบแล้วเป็นบริการ systemd Restart=alwaysปรับเปลี่ยนบริการที่จะมี

แก้ไข:

หากบริการกำลังทำงานตามที่ตั้งใจไว้คุณจะต้องให้บริการenableเพื่อเปิดใช้งานเมื่อบู๊ต:systemctl enable SERVICENAME


วิธีการนี้ใช้งานได้ถ้าฉันเริ่มด้วยตนเองโดยใช้ sudo systemctl start analytics.service แต่มันก็ไม่ได้เริ่มขึ้นเมื่อบูตระบบ ฉันลอง sudo systemctl เปิดใช้งาน analytics.service แต่มันก็ไม่ได้เกิดไฟสำรองเมื่อบูตระบบ ความคิดใด ๆ
user1732920

คุณช่วยเอาท์พุทของได้systemctl status analytics.serviceไหม นอกจากนี้ใครเป็นเจ้าของไฟล์ อาจเป็นไปได้ที่คุณจะต้องเพิ่มในUser=Add user name here[บริการ]
rowan

â analytics.service - Analytics Receiver Loaded: โหลด (/etc/systemd/system/analytics.service; เปิดใช้งาน; ที่ตั้งไว้ล่วงหน้าของผู้ขาย: เปิดใช้งาน) ใช้งาน: ใช้งาน (ทำงาน) ตั้งแต่ศุกร์ 2018-05-04 11:32:49 EDT; 43s ที่ผ่านมา PID หลัก: 4075 (php) CGroup: /system.slice/analytics.service â4075 / usr / bin / php /var/www/html/example.com/public_html/receive.php &
user1732920

ฉันเปลี่ยนจากการรันสคริปต์ bash เป็นการเรียกใช้ไฟล์ php โดยตรงในพื้นหลัง สคริปต์ทุบตีและสคริปต์ PHP เป็นเจ้าของโดยผู้ใช้ sudo ของฉัน vupmedia
user1732920

โหลดแล้ว: โหลดแล้ว (/etc/systemd/system/analytics.service; เปิดใช้งานไว้ล่วงหน้าผู้จัดจำหน่าย: เปิดใช้งาน) ใช้งาน: ไม่ทำงาน (ไม่ทำงาน) (ผลลัพธ์: รหัสออก) ตั้งแต่วันศุกร์ที่ 2018-05-04 11:46:57 EDT; 39s ที่ผ่านมากระบวนการ: 3522 ExecStart = / usr / bin / php /var/www/html/analytics.vupinteractive.com/public_html/receive.php & (รหัส = ออก, สถานะ = 255) PID หลัก: 3522 (รหัส = ออก, สถานะ = 255)
1732920
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.