วิธีดูแลและรีสตาร์ทกระบวนการโดยอัตโนมัติ


34

ฉันต้องการมีกระบวนการที่จะเริ่มต้นใหม่หากเกิดปัญหา ฉัน googled บิตและพบว่าวิธีการแก้ปัญหาที่ง่ายคือการใช้daemontools

ฉันไม่เข้าใจวิธีกำหนดค่า

  1. วิธีที่ง่ายที่สุดในการทำให้ฟังก์ชั่นดังกล่าวคืออะไร?
  2. จะกำหนดค่าได้อย่างไร?

คำตอบ:


29

คำตอบนี้ใช้กับ Ubuntu เวอร์ชั่นที่มี Upstart (<= 14.10) ใช้วิธีการอื่นสำหรับรุ่นที่มี Systemd (> = 15.04)

ดูเหมือนว่าคุณกำลังมองหาการทำงานให้อยู่แล้วในอูบุนตูกับพุ่งพรวด respawnฉันท์ในการกำหนดค่าที่จะทำสิ่งที่คุณต้องการ ฉันจะแนะนำกับการใช้วิธีการมาตรฐานน้อยกว่าในการจัดการกับเรื่องนี้

หากไม่มีรายละเอียดเพิ่มเติมเกี่ยวกับกระบวนการที่คุณพยายามจัดการกับมันยากที่จะพูดว่าการกำหนดค่าควรมีลักษณะอย่างไร มันขึ้นอยู่กับว่ามันจะยกและทำให้ตัวเองอยู่ในพื้นหลังเช่น เอกสารพุ่งพรวดบนrespawnบาทควรให้ข้อมูลเพิ่มเติมแก่คุณ

น่าเสียดายที่ยังไม่สามารถเรียกใช้งานผู้ใช้ได้อย่างถูกต้อง: ไม่สามารถเริ่มต้นเพื่อเรียกใช้งานผู้ใช้ได้

ตัวอย่าง

สมมติว่าเราต้องการให้แอปเครื่องคิดเลขทำงานต่อไปแม้ว่าจะถูกฆ่าด้วยไฟ (สัญญาณ 9)

  1. สร้างไฟล์การกำหนดค่าใน/etc/init/calculator.conf(ตามบทความนี้ ):

    #!upstart
    description "Calculator"
    
    # Start job via the daemon control script. Replace "gert" with your username.
    exec su -l gert -c 'export DISPLAY=:0; /usr/bin/gnome-calculator'
    
    # Restart the process if it dies with a signal
    # or exit code not given by the 'normal exit' stanza.
    respawn
    
    # Give up if restart occurs 10 times in 90 seconds.
    respawn limit 10 90
    
  2. เริ่มโดยการเรียกใช้

    sudo start calculator
    
  3. มันจะเปิดขึ้นบนจอแสดงผลปัจจุบันของคุณ ( :0) และเพลิดเพลินกับความสุดยอดโดยการเห็นมันเริ่มต้นใหม่หลังจากปิด

    • ระบุ ID กระบวนการเช่นโดยทำps aux | grep calculator:

      gert  13695 0.2 0.4 349744 16460 ?   Sl   13:38   0:00 /usr/bin/gnome-calculator
      
    • ฆ่ามันด้วยไฟ.

      sudo kill -9 13695
      
    • ดูมันปรากฏขึ้นอีกครั้ง:

      gert  16059 4.6 0.4 349736 16448 ?   Sl   13:40   0:00 /usr/bin/gnome-calculator
      

โปรดทราบว่าสิ่งนี้จะมีความสวยงามยิ่งขึ้นเมื่อใช้แผนสำหรับแผน Ubuntu 13.04 พร้อมการสนับสนุนงานผู้ใช้ที่เหมาะสม


ฉันได้งานที่ไม่รู้จักเมื่อฉันพยายามเริ่มหรือไม่ อุดมคติใด ๆ ฉันได้วางไฟล์ไว้ใน / etc / init
opc0de

@ opc0de ชื่อของแฟ้มที่มีเพื่อให้ตรงกับคำสั่งที่จะเริ่มต้นservicename.conf start servicenameฉันสงสัยว่าคุณได้เลือกชื่ออื่นแล้ว
gertvdijk

ไม่ตรงกับ แต่ฉันไม่ได้ทำตามตัวอย่างของคุณดังนั้นฉันคิดว่าฉันอาจมีข้อผิดพลาดทางไวยากรณ์
opc0de

@ opc0de เริ่มต้นด้วยการอธิบายเพิ่มเติมเกี่ยวกับสิ่งที่คุณพยายามทำให้สำเร็จในคำถาม: แอปพลิเคชัน / กระบวนการชนิดใดและวิธีการใช้งานตัวอย่างเช่นรายละเอียดเกี่ยวกับความพยายามในปัจจุบันของคุณ
gertvdijk

แก้ไขด้วยตัวอย่างของคุณความผิดพลาดของฉันคือฉันอาจมีข้อผิดพลาดในกฎหมายบริหาร ขอบคุณสำหรับความช่วยเหลือของคุณ!
opc0de

13

เป็นเครื่องมือที่ง่ายมากที่สามารถบรรลุผลเช่นเดียวกันโดยไม่จำเป็นต้องกำหนดค่าimmortal: https://immortal.run/

เพียงรันคำสั่งดังนี้:

immortal <cmd>

มันจะทำงานในพื้นหลังและรีสตาร์ทโดยอัตโนมัติหากออก

  • immortalctl: ดูสถานะการทำงาน มีnameคอลัมน์ที่จะพิมพ์ที่นี่คุณสามารถใช้สิ่งนี้เพื่ออ้างถึงงานด้วยคำสั่งควบคุมอื่น ๆ
  • immortalctl stop <name>: หยุดการตรวจสอบงานด้วยชื่อที่กำหนด (มันจะไม่ถูกรีสตาร์ทโดยอัตโนมัติ แต่กระบวนการปัจจุบันจะดำเนินการต่อไป)
  • immortalctl -k <name>: ส่ง SIGKILL ไปยังกระบวนการปัจจุบัน
  • immortalctl exit <name>: หยุดการตรวจสอบงานด้วยชื่อที่กำหนดและลบออกจากรายการงาน

1
ขอบคุณนี้ใช้งานได้ดีกับเคสของฉันใน 16.04 วางสิ่งนี้ไว้ในกระเป๋าเครื่องมือที่มีประโยชน์ของฉัน
Quentin Skousen

2
แท้จริงแล้วมันดูมีน้ำหนักเบากว่าคนธรรมดา / เกิดใหม่
Sridhar Sarnobat

มีวิธีที่จะให้มันแสดงstdoutและstderrในเบื้องหน้าหรือไม่?
David S.

ฉันไม่รู้จักเพราะมักใช้เพื่อเรียกใช้กระบวนการในพื้นหลัง อย่างไรก็ตามคุณสามารถใช้immortalctl -l out.log <cmd> && tail -f out.logเพื่อให้ได้ผลเช่นเดียวกัน
เครื่องยนต์ extropic

@DavidS คุณสามารถรับบันทึกรวมหรือมี stdout และ stderr immortal.run/post/stderr
nbari

1

หากคุณไม่ต้องการฟังก์ชันการทำงานของ daemon / service / background และเพียงต้องการทำในคอนโซลให้สร้างไฟล์ที่เรียกว่าautorestart.sh:

#!/bin/bash

while [ 1 ]; do
  some_command
done

จากนั้น./autorestart.shจะรีสตาร์ทโดยอัตโนมัติsome_commandหากออกหรือหยุดทำงาน CTRL-C แบ่งลูปและออกจากโปรแกรมอย่างหมดจด

ทดสอบบน Ubuntu 18.04


0

มีวิธีการที่ไม่มี "พุ่งพรวด" คำหลักคือ "inittab" :-) แม้ว่าโดยทั่วไปจะเป็นไฟล์ที่ไม่เปลี่ยนแปลงจากค่าเริ่มต้น แต่ก็สามารถใช้เพื่อให้ได้การ respawning ที่ต้องการบนเครื่อง SYSV


ฉันไม่เข้าใจว่าทำไมบางคนปฏิเสธการแก้ไขปัญหานี้ หากคุณไม่เข้าใจเพียงแค่ google; มันไม่มีประโยชน์ที่จะตัดและวางหน้าคนของ initttab ที่นี่คุณสามารถอ่านได้ด้วยตัวคุณเองในระบบของคุณ! เพียงพิมพ์ "man inittab" ...
cepal67

13
คำตอบที่มีคุณภาพสูงมีรายละเอียดมากกว่า "ใช้สิ่งนี้คิดออกด้วยตัวคุณเอง" :)
Seth

0

ps-watcher เป็นเครื่องมือที่เฝ้าดูกระบวนการที่กำลังทำงานอยู่และดำเนินการกับสถานการณ์ที่กำหนดไว้ มาติดตั้งกัน

apt-get install ps-watcher

ดูรายละเอียดด้านล่างของการเรียกใช้ HHVM พร้อมทางเลือกในการใช้ PHP-FPMซึ่งทำงานได้ดีสำหรับฉัน


เนื่องจากไม่นานโปรดเพิ่มบทสรุปของรหัสแทนบทความเนื่องจากมีเพียงส่วนสั้น ๆ ที่ใช้กับคำถามนี้
derHugo

0

กระบวนการเริ่มต้นและการตอบสนองถูกจัดการโดย "systemd" ตั้งแต่ Ubuntu 15.04 การแนะนำที่ดีสามารถพบได้ที่นี่

https://www.digitalocean.com/community/tutorials/systemd-essentials-working-with-services-units-and-the-journal

ตัวอย่างที่ช่วยให้คุณเริ่มต้นใช้งานได้ใน

https://www.devdungeon.com/content/creating-systemd-service-files

วิธีการนี้ใช้แทนสิ่งที่เก่ากว่าโดยอ้างอิงจาก / etc / inittab และ upstart

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