ฉันจะกำหนดค่า upstart ให้เรียกใช้สคริปต์เมื่อปิดระบบเมื่อกระบวนการใช้เวลานานกว่า 10 วินาทีได้อย่างไร


11

ฉันใช้ Ubuntu 11.10 ในเครื่องเสมือน (VirtualBox) เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการพัฒนาใน linux ฉันใช้ที่เก็บ git เพื่อบันทึกงานของฉันและได้เขียนสคริปต์เพื่อรวมงานของฉันและบันทึกลงในโฟลเดอร์ที่ใช้ร่วมกันเพื่อใช้ในขณะที่เครื่องเสมือนไม่ทำงาน

ฉันต้องการเรียกใช้สคริปต์นี้โดยอัตโนมัติก่อนที่จะปิดเพื่อให้งานของฉันพร้อมใช้งานเสมอหาก vm ปิด (ปัจจุบันฉันต้องเรียกใช้สคริปต์ด้วยตนเอง)

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

description     "test script to run at shutdown"

start on runlevel [056]

task

script
touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long
end script

pre-start script
touch /media/sf_LinuxEducation/pre-start
sleep 15
touch /media/sf_LinuxEducation/pre-start-long
end script

post-start script
touch /media/sf_LinuxEducation/post-start
sleep 15
touch /media/sf_LinuxEducation/post-start-long
end script

pre-stop script
touch /media/sf_LinuxEducation/pre-stop
sleep 15
touch /media/sf_LinuxEducation/pre-stop-long
end script

post-stop script
touch /media/sf_LinuxEducation/post-stop
sleep 15
touch /media/sf_LinuxEducation/post-stop-long
end script

ผลที่ได้คือสัมผัสเพียงครั้งเดียวสำเร็จ (สัมผัสแรกในก่อนเริ่มต้น) ฉันต้องเปลี่ยนอะไรเพื่อดูหนึ่งในสัมผัสหลังจากการนอนหลับเพื่อทำงาน หรือมีวิธีที่ง่ายกว่าที่จะทำให้สำเร็จลุล่วง?

ขอบคุณล่วงหน้า.

คำตอบ:


7

พุ่งพรวด Intro, ตำราและปฏิบัติที่ดีที่สุดมีจำนวนมากของโค้ดที่จะใช้ในการสร้างงานและการจ้างงานพุ่งพรวด

กระบวนการปิดส่วนของตำราบอกว่าจะทำงานและการโทร/etc/init/rc.conf ในทางกลับกันนี้ในที่สุดจะเรียก/etc/init.d/rc /etc/init.d/sendsigsดังนั้นหากคุณstart on starting rcแล้วงานของคุณจะถูกดำเนินการก่อน rc (และ sigterms ที่ปกติจะมีกระบวนการปิดตัวลง)

ไฟล์: /etc/init/test.conf

description "test script to run at shutdown"

start on starting rc
task
exec /etc/init/test.sh

ไฟล์: /etc/init/test.sh

touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long

1
เพิ่มตัวอย่างที่เป็นรูปธรรมให้กับคำถามนี้ แต่ใช้งานไม่ได้ (เฉพาะการสัมผัสครั้งแรกเท่านั้นที่ทำงานเมื่อปิดเครื่อง) แม้ว่าเอกสารประกอบในการสร้างนามแฝงเหตุการณ์จะบอกว่าควรทำ โปรดดูมันดูว่าฉันทำผิด
Tiris

Tiris สิ่งนี้ควรใช้ได้ ฉันสนใจที่จะเห็น / var / log / syslog ของคุณหลังจากรีบูตโดยเฉพาะอย่างยิ่งเพื่อดูว่ากระบวนการของการทดสอบนั้นถูกบังคับโดยการพุ่งพรวดหรือไม่
SpamapS

1
การแก้ไขคำตอบนี้ใช้งานได้ล่าสุด ตรวจสอบประวัติการแก้ไขเพื่อดูปัญหาของเด็ก ฉันเดาว่าฉันควรจะแสดงความคิดเห็นว่าฉันได้ทำการแก้ไข (หรือมีความเหมาะสมมากกว่าที่จะลบความคิดเห็นและเพิ่มใหม่หรือไม่มีมารยาทการ stackexchange?) ฉันสนใจที่จะรู้ว่าทำไมเด็กที่มีปัญหาไม่ทำงาน (เนื่องจากเอกสารระบุว่าควร)
Tiris

ไฟล์ test.conf หมายความว่าอย่างไร ฉันจะสร้างไฟล์ชื่อ test.conf หรือฉันจะเพิ่มไฟล์นี้ใน rc.conf หรือไม่
heneryville

@heneryville test.confเป็นเพียงชื่อไฟล์แบบสุ่ม whatEverYouWant.confคุณก็สามารถใช้เป็นได้อย่างง่ายดาย ความคิดเห็นของคุณยังแสดงให้เห็นว่าคุณไม่ได้อ่าน "ตำรา" ที่กล่าวถึงในคำตอบ หากคุณดูในส่วน 4.2 ไฟล์การกำหนดค่างานจะอธิบายอย่างละเอียดยิ่งขึ้น
Tiris

7

ฉันคิดว่าสิ่งนี้ไม่สามารถทำได้ผ่านการพุ่งพรวดเนื่องจากสคริปต์/etc/init.d/sendsigsซึ่งถูกเรียกใช้โดยการพุ่งพรวดเมื่อหยุด / เริ่มการทำงานใหม่ฆ่ากระบวนการทั้งหมด ( killall5 -9) ภายใน 10 วินาทีและแม้ว่าจะไม่ประสบความสำเร็จก็ตาม สำหรับ unmounting ทุกอย่างและปิด

วิธีที่ดีที่สุดคือการใช้สคริปต์สไตล์/etc/init.d ที่เป็นสนิม

ตัวอย่าง: /etc/init.d/shutdown_job

#! /bin/sh
### BEGIN INIT INFO
# Provides:          shutdown_job
# Required-Start:    
# Required-Stop:     sendsigs
# Default-Start:
# Default-Stop:      0 6
# Short-Description: bla
# Description: 
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

do_stop () {
    date > /root/s.log
    sleep 20
    date >> /root/s.log
}

case "$1" in
  start)
    # No-op
    ;;
  restart|reload|force-reload)
    echo "Error: argument '$1' not supported" >&2
    exit 3
    ;;
  stop)
    do_stop
    ;;
  *)
    echo "Usage: $0 start|stop" >&2
    exit 3
    ;;
esac

:

จากนั้นเปิดใช้งานสคริปต์

sudo update-rc.d shutdown_job start 19 0 6 .

สิ่งนี้จะทำให้สคริปต์ก่อนสคริปต์sendigsบน runlevels 0 a 6 (ปิดเครื่องรีบูต) สคริปต์ตัวอย่างนี้จะบันทึกวันที่แล้วพักประมาณ 20 วินาทีจากนั้นบันทึกวันที่อีกครั้งไปที่/root/s.log )

ข้อมูลเพิ่มเติม:


ฉันไม่คุ้นเคยกับการทำสิ่งนี้ มีแนวทางที่ดีในการทำให้เรื่องนี้ทำงานได้หรือไม่? โปรดแก้ไขด้วยข้อมูลเพิ่มเติม
Tiris

ฉันลองสิ่งนี้แล้ว แต่มันก็ใช้ไม่ได้ ฉันเพิ่มtouch /media/sf_LinuxEducation/startและtouch /media/sf_LinuxEducation/start-longขวาถัดจากคำสั่งวันที่ วันที่เข้าสู่ระบบ แต่สัมผัสไม่ได้สัมผัส นี่ทำให้ฉันสงสัยว่าไดรฟ์นั้นถูก unmount ในเวลาที่สคริปต์ทำงานหรือไม่ ฉันคิดว่ามันอาจมีบางอย่างเกี่ยวข้องกับอาร์กิวเมนต์ NN แต่ฉันไม่แน่ใจจริงๆว่าอาร์กิวเมนต์นี้ทำงานอย่างไร (หน้า man อธิบายได้ในแนวโค้งงอมาก) คุณจะรู้ได้อย่างไรว่าควรตั้งค่าหมายเลข (หรือคู่ของตัวเลข) ในอาร์กิวเมนต์นี้อย่างไร
Tiris

สคริปต์ได้รับการดำเนินการตามจำนวนที่เห็นเมื่อคุณรายการ/etc/rc6.dไดเรกทอรี ดังนั้นสคริปต์การปิดระบบ19 รายการควรได้รับการดำเนินการก่อนที่จะยกเลิกการเมานท์ใด ๆ (> 31) แต่ทำไมไม่ลองสมมติฐานของคุณแล้วแตะไฟล์/rootแทนล่ะ
จัด

การค้นหาใน dir /etc/rc6.dแสดงให้เห็นว่าโฟลเดอร์ที่แชร์ถูกเมาต์ / เลิกเมานท์ด้วยK70vboxaddสคริปต์ จะเปลี่ยนอาร์กิวเมนต์ NN (สำหรับสคริปต์ของฉัน) เป็น 71 หรือไม่เพื่อให้สคริปต์ของฉันทำงานก่อนที่จะเลิกเมานท์โฟลเดอร์แชร์ VB ฉันจะลองใหม่ในวันนี้
Tiris

ก็ไม่ได้ผล อัปเดต:ฉันเพิ่มtouch /root/startก่อนsleep 20คำสั่งและไม่มีการสร้างไฟล์ ฉันไม่รู้ด้วยซ้ำว่าจะหาสาเหตุได้ที่ไหน มีการเพิ่มวันที่ลงใน/root/s.logไฟล์อย่างมีความสุขทำไมฉันจึงไม่สามารถสัมผัสไฟล์ได้?
Tiris
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.