Thực thi lệnh trước khi tắt / khởi động lại [trùng lặp]


18

Tôi có một máy chạy một vài VM mơ hồ. Vấn đề tôi gặp phải là đôi khi tôi quên tắt máy ảo đó trước khi tắt máy hoặc khởi động lại máy. Do đó, máy của tôi bị kẹt với thông báo này:waiting for vboxnet0 to become free

Tôi đã tìm kiếm về các giải pháp và tôi tìm thấy trang này:

http://en.kioskea.net/faq/3348-ubfox-executing-a-script-at-startup-and-shutdown

Tôi đã thử những gì họ tắt máy, nhưng nó không hoạt động.

Tôi đã viết một tập tin sh cho lệnh đó:

#!/bin/bash

cd ~/workspace/git/mediaservice
vagrant halt

bất kỳ đề xuất?


4
Phương thức trong liên kết là hợp lệ và hoạt động trên tất cả các phiên bản linux nên tập lệnh của bạn bị sai;) Người dùng không biết khi tắt máy do nó được thực hiện bởi người dùng root. Vì vậy, bỏ "~" và làm cho nó một đường dẫn đầy đủ.
Rinzwind

Nó có hoạt động không? Tôi đã theo dõi một manuel tương tự như gist.github.com/ymc-geha/8416723 nhưng không hoạt động với tôi trên
ubfox

@ user2135804 Tôi nghĩ rằng nó đã làm .. nhưng thực sự nó không hoạt động cho Vagrant .. Tôi đã thử với những thứ khác và nó hoạt động tốt.
SERPRO

1
Nhân tiện, lỗi bạn mô tả là ở đây .
Garrett

1
Như đã thấy trong báo cáo lỗi, điều này đã được sửa và sẽ được bao gồm trong VirtualBox 4.3.29.
Garrett

Câu trả lời:


11

Nếu các VM mơ hồ của bạn đang sử dụng VirtualBox, bạn có thể sửa đổi / etc / default / virtualbox và thay đổi dòng ghi:

SHUTDOWN_USERS=""

đến

SHUTDOWN_USERS="all"

Điều đó đã sửa nó cho tôi trên Ubuntu 14.04


1
Trên thực tế có một vé mở trong hộp ảo kết nối với điều này. virtualbox.org/ticket/12264 . Tôi sẽ cố gắng sử dụng SHUTDOWN_USERS=`cut -d: -f1 /etc/passwd`thay vìSHUTDOWN_USERS="all"
đang chạy.

Tôi cũng đang dùng Ubuntu 14.04 với Vagrant bằng VirtualBox, nhưng tôi không có bất kỳ /etc/default/virtualboxtệp nào ...
Garrett

21

Để thực thi tập lệnh khi tắt máy hoặc khởi động lại:

  1. lưu tập lệnh của bạn trong /etc/rc6.d
  2. Làm cho nó thực thi: sudo chmod +x K99_script

Ghi chú:

  • Tập lệnh trong RC6.d phải không có phần mở rộng .sh
  • Tên tập lệnh của bạn phải bắt đầu bằng K99 để chạy đúng lúc.
  • Các tập lệnh trong thư mục này được thực hiện theo thứ tự bảng chữ cái.

nguồn


1
Thật. Đặt tên đúng để nó chạy đúng lúc là rất quan trọng.
shivams

1
Tôi đặt một tập lệnh trong /etc/rc6.d và nó không chạy khi tắt máy. Tôi đặt nó trong /etc/rc0.d và nó đã chạy khi tắt máy. Có lẽ, RC.6 chỉ để khởi động lại.
Erel Segal-Halevi

2
@Erel Segal-Halevi Tôi vừa thử thêm tập lệnh K99 vào /etc/rc6.d và nó đã không thực thi. Nhìn vào các tập lệnh khác, có một dòng ** đậm K10reboot -> ../init.d/reboot **, vì vậy có vẻ như tập lệnh K99 KHÔNG BAO GIỜ được thực thi !!
David Walker

Câu trả lời từ Ravi dưới đây là lựa chọn tốt hơn vì nó sử dụng các liên kết tượng trưng để đảm bảo tập lệnh chạy trên cả tắt máy và khởi động lại. Tôi cũng nghĩ rằng hầu hết các tập tin hệ thống có xu hướng sử dụng phương pháp này.
Eddie

12

Cách thực hiện với Systemd (dễ dàng hơn)

Bây giờ các biến thể Ubuntu và Mint đã chuyển sang systemd, tôi thấy các giải pháp cũ của tôi dựa trên những điều trên là không thỏa đáng. Tôi đã tìm kiếm trên web để tìm hiểu làm thế nào để làm điều đó với systemd và cuối cùng kết hợp sự khôn ngoan của người khác và ghi lại nó như một bài đăng trên blog tại blogspot.com.au có chứa hướng dẫn sau đây.

Với systemd, bạn tạo một hoặc hai tệp để gọi các tập lệnh của mình bằng các mẫu bên dưới và thực thi một vài lệnh. Đơn giản.


Phiên bản GUI

Đầu tiên tạo tập lệnh bạn muốn chạy khi khởi động và / hoặc tắt máy. Chỉ cần làm một nếu bạn không yêu cầu cả hai. Tôi đã tạo .scopening_atstart và .scfullcopy_atend.

Sau đó, đảm bảo rằng cả hai đều có thể thực thi được bằng cách nhấp chuột phải vào tệp, chọn thuộc tính và đảm bảo rằng, dưới quyền, bạn đã đánh dấu Cho phép thực thi tệp dưới dạng chương trình.

nhập mô tả hình ảnh ở đây

Hai tệp tôi đã tạo cư trú và lưu nội dung của một đĩa RAM. Họ cũng tạo một tập tin trong thư mục nhà của tôi để chứng minh rằng dịch vụ đang hoạt động. Chúng có dạng:

#!/bin/sh
cp -pru /home/john/zRamdisk/subdirectory1/* /home/john/.wine/drive_c/subdirectory1/
rm /home/john/stop_time
date +%D' '%T > /home/john/stop_time

Sau đó, tôi đã mở trình quản lý tệp của mình dưới dạng root, mở /etc/systemd/systemvà tạo tệp startup.service và tệp save-ramdisk.service. Rõ ràng bạn có thể chọn tên riêng của mình và tên chung có thể bao gồm một tệp khởi động được gọi là johns_start.service và một tệp tắt máy có tên là johns_shutdown.service. Chỉ không chọn tên dịch vụ hiện có.

[Unit]
Description=Startup Applications

[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart

[Install]
WantedBy=multi-user.target

[Unit]
Description=Save Ramdisk to Wine drive C

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/john/.scfullcopy_atend

[Install]
WantedBy=multi-user.target

Bạn có thể sử dụng cùng các tệp dịch vụ, thay thế đường dẫn đầy đủ của tập lệnh thực thi của bạn cho tôi.

Cuối cùng, với mỗi người thực thi lệnh systemctl, hãy kích hoạt your_files_name (nhưng không có dịch vụ hậu tố). Vì vậy, cái đầu tiên của tôi làsystemctl enable startup

Khởi động lại máy tính một lần để bắt đầu dịch vụ. Dịch vụ khởi động sẽ được thực thi bất cứ khi nào systemd đi vào mục tiêu nhiều người dùng và dịch vụ dừng khi thoát khỏi mục tiêu nhiều người dùng. Các tệp dịch vụ thay thế với các điều kiện kích hoạt khác nhau sẽ được mô tả bên dưới.

Các lệnh hữu ích khác bao gồm:

systemctl được kích hoạt khởi động
systemctl đang hoạt động khởi động
systemctl khởi động lại

Nhiều hơn có thể được tìm thấy tại các tài liệu tham khảo ở trên.



Phiên bản CLI (Dòng lệnh)

Mô tả này giả định rằng bạn hoạt động từ thư mục chính của bạn chứ không phải / home / john, sử dụng sudo khi cần và lựa chọn biên tập viên của bạn nơi tôi viết vim hoặc svim.

Tạo các kịch bản shell khởi động và tắt với dòng đầu tiên #!/bin/shvà làm cho chúng có thể thực thi được bằng cách sử dụng chmod +x my_new_filename.

Tạo hai tệp như trên hoặc trong ví dụ này, một tệp để xử lý các tác vụ khởi động và tắt máy. Tôi sẽ thực thi các tập lệnh trong thư mục nhà của mình nhưng @don_crissti hiển thị một số lựa chọn thay thế tại Stack Exchange .

svim /etc/systemd/system/start_and_stop.service

và sao chép trong nội dung tập tin:

[Unit]
Description=Run Scripts at Start and Stop

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/john/.startup_commands  #your paths and filenames
ExecStop=/home/john/.shutdown_commands

[Install]
WantedBy=multi-user.target

Sau đó kích hoạt Dịch vụ bằng lệnh:

systemctl enable start_and_stop

và khởi động lại hệ thống của bạn sau đó các dịch vụ sẽ hoạt động. Các lệnh systemctl is-enabled start_and_stopsystemctl is-active start_and_stopcó thể được sử dụng trong việc giám sát các dịch vụ mới của bạn.



Thay đổi điều kiện kích hoạt để tắt máy

Tất cả các tệp trên đều sử dụng mở hoặc đóng môi trường nhiều người dùng để bắt đầu chạy các tập lệnh. Các tập tin dưới đây sử dụng bắt đầu của bốn quá trình tắt máy tiềm năng để bắt đầu các tập lệnh của nó. Thêm hoặc xóa các mục tiêu trên dòng Before + dòng WantedBy sẽ cho phép bạn tạo ra sự khác biệt tốt hơn:

Tập tin này đã được đề xuất trong câu trả lời thứ hai của bài đăng này nhưng tôi không thể chạy nó cho đến khi tôi thêm phần Cài đặt.

Một lần nữa, chỉnh sửa tập lệnh trong /etc/systemd/service/và kích hoạt nó bằng cách sử dụng systemctl enable your_file_name. Khi tôi thay đổi các mục tiêu, tôi đã sử dụng systemclt disable file_namelệnh và sau đó kích hoạt lại nó để liên kết nó với các thư mục đích. Khởi động lại và dịch vụ sẽ được vận hành.

[Unit]
Description=Do something required
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
#   executed before the target state is entered
# Also consider kexec.target

[Service]
Type=oneshot
ExecStart=/home/john/.my_script  #your path and filename

[Install]
WantedBy=halt.target reboot.target shutdown.target

7
dễ dàng hơn? dễ hơn cái gì? dễ dàng hơn leo lên đỉnh Everest? mọi giải pháp khác được đăng ở đây đều dễ dàng hơn giải pháp này ...
Fran Marzoa

Ồ, đó là một câu trả lời hoàn chỉnh và bằng văn bản, và những gì mọi người nên làm - vấn đề đặt tên với /etc/rc6.d và sự nhầm lẫn cho thấy rằng đó không phải là câu trả lời hay. Nếu một thủ tục đơn giản, thì nó không nhất thiết phải có sức mạnh để đạt được kết thúc của nó một cách an toàn. Xem phần [Cài đặt] - bạn có thể chắc chắn rằng tập lệnh của bạn sẽ thực thi đúng thời điểm. Hơn nữa, vì một câu trả lời dài, điều đó không có nghĩa là nó phức tạp! Cảm ơn btw, John9631, câu trả lời này là hoàn hảo và sẽ là vô giá trong việc tạo ra các kịch bản an toàn và hiệu quả tại thời điểm quan trọng của nhiệm vụ ...
cối xay khỉ đột

11
  1. Tạo một tệp thực thi shell với tập lệnh của bạn trong thư mục /etc/init.d/.

  2. Vì việc này phải được thực thi trong khi tắt máy hoặc khởi động lại, cần tạo các liên kết mềm trong /etc/rc0.d/ và /etc/rc6.d

Thí dụ:

sudo ln -s /etc/init.d/<your_file> /etc/rc0.d/k99stop_vm
sudo ln -s /etc/init.d/<your_file> /etc/rc6.d/k99stop_vm
sudo chmod a+x /etc/init.d/<your_file>

chmodthay đổi các cờ cho phép của mục tiêu liên kết, giống nhau cho cả hai đối số. Chỉ định cả hai là dư thừa.
David Foerster

2

Bạn có thể tìm thấy giải pháp tại đây: Tạm dừng / tiếp tục tất cả các hộp Vagrant khi tắt / khởi động hệ thống .

Có một tập lệnh init đơn giản treo tất cả các hộp đang chạy trước khi tắt.

Cài đặt

Chỉnh sửa /etc/init.d/vagrant-boxesvà dán tập lệnh từ bài viết trên và lưu. Hoặc tải về từ đây và lưu nó vào /etc/init.d/vagrant-boxes. Trên debian / ubfox, v.v.

# update-rc.d vagrant-boxes defaults 99 01

Số 99 là số thứ tự và phải lớn hơn (trong trường hợp của tôi là Virtualbox số 20, nhân tiện là mặc định trên các bản phân phối Debian). Số thứ hai là chuỗi khi tắt máy tính. Vì vậy, nó có thể là tốt để làm trước hết.


2

Đối với Ubuntu 14.10, bạn thích cái gì đó RC04khôngRC99

Làm gì từ đầu

  1. Tạo một kịch bản tại /etc/init.d/scriptName
  2. Liên kết qua ln -s /etc/rc6.d/K04scriptName /etc/init.d/scriptName

Những bước tôi đã trải qua

  1. Tôi đã thử sử dụng Ubuntu không thành công - Thực thi tập lệnh khi khởi động và tắt máy
  2. Tôi tìm thấy tập lệnh tắt máy Ubuntu 14.10 với RC0.d (rc6.d, rc.d)
  3. Tôi đã thay đổi từ /etc/rc6.d/RC99linkName thành /etc/rc6.d/RC04linkName và nó hoạt động
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.