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. 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, 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.
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 .
vim /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
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_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