Làm cách nào để định cấu hình khởi động để chạy tập lệnh khi tắt máy khi quá trình này mất hơn 10 giây?


11

Tôi đang chạy Ubuntu 11.10 trong một máy ảo (VirtualBox) để tìm hiểu thêm về phát triển trong linux. Tôi đang sử dụng kho git để lưu công việc của mình và đã viết một tập lệnh để đóng gói công việc của tôi và lưu nó vào thư mục dùng chung để sử dụng trong khi máy ảo không chạy.

Tôi muốn tự động chạy tập lệnh này trước khi tắt máy để công việc của tôi luôn khả dụng nếu vm bị tắt (hiện tại tôi phải tự chạy tập lệnh).

Tôi không biết nếu mới bắt đầu là cách tốt nhất để thực hiện điều này, nhưng đây là cấu hình mà tôi đã viết dưới dạng thử nghiệm:

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

Kết quả là chỉ có một lần chạm được thực hiện (lần chạm đầu tiên trong lần khởi động trước). Tôi cần thay đổi gì để thấy một trong những lần chạm sau khi ngủ để làm việc? Hoặc có cách nào dễ dàng hơn để đạt được điều này?

Cảm ơn trước.

Câu trả lời:


7

Các Upstart Giới thiệu, Cookbook và Thực tiễn tốt nhất có một số lượng lớn các đoạn mã để sử dụng trong việc tạo ra công việc mới nổi và các công việc.

Phần quy trình tắt của sách dạy nấu ăn /etc/init/rc.confsẽ được chạy và gọi /etc/init.d/rc. Đến lượt nó cuối cùng sẽ gọi /etc/init.d/sendsigs. Vì vậy, nếu bạn start on starting rcthì nhiệm vụ của bạn sẽ được thực hiện trước khi RC (và các sigterms thường sẽ tắt quá trình).

tệp: /etc/init/test.conf

description "test script to run at shutdown"

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

tệp: /etc/init/test.sh

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

1
Đã thêm một ví dụ cụ thể cho câu hỏi này, nhưng nó không hoạt động (chỉ lần chạm đầu tiên được chạy khi tắt máy) mặc dù tài liệu trong Tạo bí danh sự kiện nói rằng nó nên như vậy. Xin vui lòng nhìn vào nó xem tôi có lỗi không.
Tiris

Tiris, điều này sẽ làm việc. Tôi muốn xem / var / log / syslog của bạn sau khi khởi động lại, đặc biệt là để xem liệu quy trình kiểm tra có bị buộc phải giết khi mới bắt đầu hay không.
SpamapS

1
Chỉnh sửa mới nhất của câu trả lời này không hoạt động. Kiểm tra lịch sử sửa đổi để xem vấn đề con. Tôi đoán tôi nên đã nhận xét rằng tôi đã thực hiện một chỉnh sửa (hoặc nó phù hợp hơn để xóa nhận xét và thêm một nhận xét mới? Có một nghi thức stackexchange?). Tôi sẽ quan tâm đến việc tại sao đứa trẻ gặp vấn đề không hoạt động (vì tài liệu nói rằng nó nên như vậy).
Tiris

Chính xác thì tệp test.conf có nghĩa là gì? Tôi có tạo một tệp có tên test.conf hay tôi thêm tệp này vào RC.conf?
heneryville

@heneryville test.confchỉ là một tên tệp ngẫu nhiên. Bạn có thể dễ dàng sử dụng whatEverYouWant.conf. Nhận xét của bạn cũng cho thấy rằng bạn đã không đọc "Cookbook" được đề cập trong câu trả lời. Nếu bạn xem trong phần 4.2, tệp cấu hình công việc sẽ được giải thích kỹ hơn.
Tiris

7

Tôi nghĩ rằng đây không thể được thực hiện thông qua mới nổi , như /etc/init.d/sendsigs kịch bản, được gọi bởi mới nổi khi ngập ngừng / khởi động lại, giết chết tất cả các quá trình ( killall5 -9) trong vòng 10 giây, và thậm chí nếu điều đó không thành công, nó đi cho việc ngắt kết nối mọi thứ và tắt máy.

Cách tốt nhất là sử dụng các tập lệnh kiểu /etc/init.d .

Ví 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

:

Sau đó kích hoạt tập lệnh

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

Điều này sẽ đặt tập lệnh trước tập lệnh sendigs trên runlevels 0 a 6 (tắt máy, khởi động lại). Tập lệnh mẫu này sẽ ghi lại ngày, sau đó ngủ trong 20 giây, sau đó ghi lại ngày vào /root/s.log .)

Thêm thông tin:


Tôi hoàn toàn không quen với việc làm điều này. Có một hướng dẫn tốt về việc này để làm việc? Vui lòng chỉnh sửa với nhiều thông tin hơn.
Tiris

Tôi đã thử nó và nó không hoạt động (cũng không chính xác). Tôi đã thêm một touch /media/sf_LinuxEducation/starttouch /media/sf_LinuxEducation/start-longngay bên cạnh các lệnh ngày. Ngày được ghi lại, nhưng chạm không được chạm. Điều này làm cho tôi tự hỏi nếu ổ đĩa đó không được đếm tại thời điểm tập lệnh được chạy. Tôi nghĩ rằng nó có thể có liên quan đến đối số NN, mặc dù tôi không chắc chắn thực sự cách thức hoạt động của cuộc tranh luận này (trang người đàn ông giải thích nó theo cách rất uốn cong tâm trí). Làm thế nào để bạn biết số nào (hoặc cặp số) nên được đặt trong đối số này?
Tiris

Các tập lệnh được thực thi theo số của chúng như đã thấy khi bạn liệt kê /etc/rc6.dthư mục. Vì vậy, kịch bản tắt máy 19 nên được thực thi trước khi thực hiện bất kỳ việc ngắt kết nối nào (> 31). Nhưng tại sao không thử giả thuyết của bạn và /rootthay vào đó chạm vào một tập tin ?
sắp xếp

Nhìn vào thư mục /etc/rc6.dcho thấy các thư mục được chia sẻ đang được gắn kết / ngắt kết nối với K70vboxaddtập lệnh. Việc thay đổi đối số NN (đối với tập lệnh của tôi) thành 71 có giúp tập lệnh của tôi chạy trước khi kết thúc các thư mục chia sẻ VB không? Tôi sẽ thử nó sau ngày hôm nay.
Tiris

Vâng, điều đó đã không làm việc. Cập nhật: Tôi đã thêm một touch /root/starttrước sleep 20lệnh và không có tập tin nào được tạo. Tôi thậm chí không biết bắt đầu từ đâu để tìm hiểu lý do tại sao. Ngày được thêm vào /root/s.logtập tin một cách vui vẻ tại sao tôi không thể chạm vào một tập tin?
Tiris
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.