ฉันจะรันคำสั่งเดียวเมื่อเริ่มต้นโดยใช้ systemd ได้อย่างไร


113

ฉันต้องการเริ่มต้นคลัสเตอร์ Apache Spark หลังจากบูตโดยใช้คำสั่งต่อไปนี้:

sudo ./path/to/spark/sbin/start-all.sh

จากนั้นรันคำสั่งนี้เมื่อระบบเตรียมการรีบูต / ปิดเครื่อง:

sudo ./path/to/spark/sbin/stop-all.sh

ฉันจะเริ่มได้อย่างไร มีแม่แบบพื้นฐานที่ฉันสามารถสร้างได้หรือไม่?

ฉันพยายามใช้ง่ายมาก (ไฟล์:) /lib/systemd/system/spark.service:

[Unit]
Description=Spark service

[Service]
ExecStart=sudo ./path/to/spark/sbin/start-all.sh

ซึ่งไม่ได้ผล


ดูได้ที่: wiki.ubuntu.com/SystemdForUpstartUsers

สวัสดี @WillemK ฉันได้ดูหน้านี้แล้ว ปัญหานี้ผมพบคือผมไม่สามารถเพียงแค่แทนที่ด้วยexec ExecStart=นอกจากนี้ฉันไม่เคยใช้พุ่งพรวดมาก่อน
macourtney7

1
จุดก่อนเส้นทางของสคริปต์ของคุณดูน่าสงสัยอย่างยิ่ง
Andrea Lazzarotto

@AndreaLazzarotto ฉันคิดว่า OP กำลังพยายามเรียกใช้สคริปต์อย่างที่ OP ทำในเทอร์มินัลดังนั้น....
George Udosen

สวัสดี @AndreaLazzarotto สิ่งนี้ถูกต้อง ขออภัยในความสับสนที่เกิดขึ้น
macourtney7

คำตอบ:


142

.serviceไฟล์ของคุณควรมีลักษณะดังนี้:

[Unit]
Description=Spark service

[Service]
ExecStart=/path/to/spark/sbin/start-all.sh

[Install]
WantedBy=multi-user.target

ตอนนี้ให้ทำขั้นตอนเพิ่มเติมเพื่อเปิดใช้งานและใช้งาน.serviceไฟล์:

  1. วางไว้ใน/lib/systemd/systemโฟลเดอร์พร้อมพูดชื่อmyfirst.service

  2. ทำให้สคริปต์ของคุณทำงานได้ด้วย:

    chmod u+x /path/to/spark/sbin/start-all.sh
    
  3. เริ่มเลย:

    sudo systemctl start myfirst
    
  4. เปิดใช้งานเพื่อให้ทำงานเมื่อบูท:

    sudo systemctl enable myfirst
    
  5. หยุดนะ:

    sudo systemctl stop myfirst
    

หมายเหตุ:

  1. คุณไม่จำเป็นต้องเปิด Spark ด้วย sudo ในบริการของคุณเนื่องจากผู้ใช้บริการเริ่มต้นนั้นรูทอยู่แล้ว

  2. ดูลิงค์ด้านล่างเพื่อดูsystemdตัวเลือกเพิ่มเติม

UPDATE

ตอนนี้สิ่งที่เรามีข้างต้นเป็นเพียงพื้นฐานนี่คือการตั้งค่าที่สมบูรณ์แบบสำหรับประกายไฟ:

[Unit]
Description=Apache Spark Master and Slave Servers
After=network.target
After=systemd-user-sessions.service
After=network-online.target

[Service]
User=spark
Type=forking
ExecStart=/opt/spark-1.6.1-bin-hadoop2.6/sbin/start-all.sh
ExecStop=/opt/spark-1.6.1-bin-hadoop2.6/sbin/stop-all.sh
TimeoutSec=30
Restart=on-failure
RestartSec=30
StartLimitInterval=350
StartLimitBurst=10

[Install]
WantedBy=multi-user.target

ในการตั้งค่าบริการ:

sudo systemctl start spark.service
sudo systemctl stop spark.service
sudo systemctl enable spark.service

อ่านเพิ่มเติม

โปรดอ่านลิงค์ต่อไปนี้ Spark คือการตั้งค่าที่ซับซ้อนดังนั้นคุณควรเข้าใจว่ามันทำงานร่วมกับบริการเริ่มต้นของ Ubuntu ได้อย่างไร

https://datasciencenovice.wordpress.com/2016/11/30/spark-stand-alone-cluster-as-a-systemd-service-ubuntu-16-04centos-7/

https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files

https://www.freedesktop.org/software/systemd/man/systemd.unit.html


สังเกตและอัปเดต
George Udosen

1
ขอบคุณสำหรับสิ่งนี้ฉันได้สร้างไฟล์ตามสิ่งที่คุณแนะนำ เมื่อทำงานsudo systemctl start sparkจะได้รับข้อผิดพลาดต่อไปนี้:Failed to start spark.service: Unit spark.service is not loaded properly: Invalid argument. See system logs and 'systemctl status spark.service' for details.
macourtney7

ส่วนหลักของsystemctl status spark.serviceมีดังนี้Executable path is not absoluteและspark.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
macourtney7

ปัญหาคือ 1) เส้นทางไบนารี Spark (ควรแทนที่สิ่งที่เรามีในไฟล์บริการ) จำเป็นต้องมี 2) Spark มีคำสั่งปิดระบบมันคืออะไร 3) คุณผ่านการเชื่อมโยงที่ฉันให้คุณ ฉันไม่ได้ใช้ประกายไฟเพื่อให้พวกเขา
จอร์จ Udosen

@ GeorgeEdosen ขอบคุณสำหรับคำตอบของคุณคำถามของฉันคือฉันจะเรียกใช้ spark ภายใต้คำสั่งเฉพาะหลังจากรีบูตได้อย่างไรคำถามอยู่ที่นี่askubuntu.com/questions/979498/ …
Soheil Pourbafrani

2

สิ่งนี้จะสร้างและรัน/root/boot.shบน boot (เป็น root) โดยใช้ไฟล์บริการขั้นต่ำ:

bootscript=/root/boot.sh
servicename=customboot

cat > $bootscript <<EOF
#!/usr/bin/env bash
echo "$bootscript ran at $(date)!" > /tmp/it-works
EOF

chmod +x $bootscript

cat > /etc/systemd/system/$servicename.service <<EOF
[Service]
ExecStart=$bootscript
[Install]
WantedBy=default.target
EOF

systemctl enable $servicename

คุณสามารถCtrl+ Cนี่ลงในรูทเทอร์มินัล

ในการแก้ไขพารามิเตอร์ตัวอย่างเช่นการใช้ที่แตกต่างกัน$bootscriptให้ตั้งค่าตัวแปรนั้นด้วยตนเองและเพียงข้ามบรรทัดนั้นเมื่อคัดลอกคำสั่ง

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

systemctl start $servicename

ทุกขั้นตอนสามารถทำได้ด้วย sudo แต่มันซับซ้อนกว่าเล็กน้อยและบางระบบไม่มี sudo ติดตั้งดังนั้นบางคนจะต้องแก้ไขตัวอย่างก่อนใช้งาน ดังนั้นฉันเลือกที่จะไม่รวม sudo ในตัวอย่าง


ฉันสับสนกับ systemd docs แต่ไม่ควรType=oneshot RemainAfterExit=yesหรือ systemd จะพิจารณางานที่ไม่ได้ใช้งานเว้นแต่ว่าสคริปต์ที่กำหนดเองจะทำให้กระบวนการบางอย่างทำงาน
Peter Lamberg

@PeterLamberg ฉันพยายามอ่าน systemd docs ด้วยและที่นี่เราทั้งคู่ต่างก็เป็น;) ฉันจำได้ว่าพวกเขายังไม่ชัดเจนมาก แต่คำตอบที่ฉันโพสต์นั้นเหมาะกับฉันในหลาย ๆ ระบบ (ฉันกลับมาที่หน้านี้ทุกครั้งแล้วเมื่อฉันต้องการมันอีกครั้ง) คุณหมายความว่าเพราะถือว่าเป็น 'ไม่ทำงาน' การโทร 'เริ่ม' ต่อเนื่องทุกครั้งจะเรียกใช้สคริปต์อีกครั้งหรือไม่ เพราะฉันจะพิจารณาสิ่งนั้นตามที่คาดไว้สำหรับเชลล์สคริปต์ ฉันพบว่ามันแปลกถ้าฉันต้อง 'หยุด' บางสิ่งที่ไม่ได้ใช้งานจริงก่อนที่ฉันจะสามารถเริ่มได้อีกครั้ง
Luc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.