Làm thế nào để làm điều đó với systemd
Nếu bạn tìm thấy chủ đề này sau tháng 6 năm 2016, Ubuntu và các công cụ phái sinh của nó bao gồm Mint sẽ sử dụng systemd để kiểm soát việc khởi tạo và tắt hệ thống. Tôi có vấn đề với cách tiếp cận cũ nên đã nghiên cứu cách hệ thống.
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 hiện một 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. 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.
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/system
và 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
và
[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, ngườ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.
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/sh
và 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_stop
và systemctl is-active start_and_stop
có 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
Các tệp trên đều sử dụng mở hoặc đóng của 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 tại Unix & Linux bởi @Matthias 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_name
lệ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