Thực thi tập lệnh khi đăng xuất / khởi động lại / tắt máy trong Ubuntu


30

Tôi muốn chạy một .shtệp bằng cách sử dụng bash khi đăng xuất và tắt Ubuntu. Tôi đã tìm kiếm lên xuống web và chỉ tìm thấy các bản sửa lỗi cho KDE và Gnome. Kịch bản rất đơn giản, tôi chỉ cần biết liệu tôi có thể thêm dòng mã vào tệp "đăng xuất / tắt máy" hay không nếu tôi cần tham chiếu nó trong tập lệnh khác.


1
Đặt liên kết tượng trưng cho các tệp thực thi trong /etc/init.d trong /etc/rc0.d và /etc/rc6.d
Tuy nhiên, một người dùng khác

2
Vui lòng xem xét chấp nhận câu trả lời cập nhật (sử dụng systemd) để mọi người sẽ thấy nó trên đầu trang.
Jonathan Y.

Câu trả lời:


18

Để thực thi tập lệnh khi đăng xuất:

Thêm dòng sau:

session-cleanup-script=/path/to/script

trong /etc/lightdm/lightdm.conftập tin

Bạn phải khởi động lại lightdm để thay đổi này có hiệu lực. Để thực hiện việc này trong tty1 bằng Ctrl+ Alt+ F1, đăng nhập bằng tên người dùng và mật khẩu của bạn và chạy lệnh sau:

sudo service lightdm restart

Lưu ý: sử dụng Ctrl+ Alt+ F7để chuyển sang phiên đồ họa

Để thực thi tập lệnh khi khởi động lại:

  1. Đặt kịch bản của bạn vào /etc/rc0.d
  2. Làm cho nó thực thi: sudo chmod +x K99_script
  3. Ghi chú:
    • 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.
    • Tên tập lệnh của bạn phải bắt đầu K99để chạy đúng lúc.

Để thực thi tập lệnh khi tắt máy:

  1. Đặt kịch bản của bạn vào /etc/rc6.d
  2. Làm cho nó thực thi: sudo chmod +x K99_script
  3. Ghi chú:
    • 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.
    • Tên tập lệnh của bạn phải bắt đầu K99để chạy đúng lúc.

Nguồn:


4
Đó là truyền thống đặt tên kịch bản bắt đầu với Kcho 'giết' và Scho 'Bắt đầu'.
kiri

Nếu kịch bản cần đặc quyền sudo thì sao? Theo như tôi có thể nói, các tập lệnh /etc/rc6.d được chạy như người dùng và không thể sử dụng gksudo.
Urhixidur

1
không hoạt động với tôi với 14.04, có sự thay đổi hoặc sự kiện quan trọng không xác định nào không?
tomasb

2
Lời khuyên K99 không tốt cho việc tắt / khởi động lại nếu bạn muốn lưu một số dữ liệu vì nó xảy ra SAU KHI ngắt kết nối VÀ K được sử dụng để vô hiệu hóa tập lệnh (xem /etc/rcS.d/README), sử dụng S để bắt đầu và đặt nó trước khi ngắt kết nối, để khởi động, hãy đặt tập lệnh của bạn sau khi mount, bị kẹt vì điều này thông tin sai, được giải quyết với S là chữ cái đầu tiên
tomasb

6
Điều này rất sai: i) tên tập lệnh cần bắt đầu bằng một chữ số K0, 1 và 6 và Scho chữ viết 2, 3, 4 và 5; ii) bạn không cần gọi tập lệnh K99_foo, số chỉ xác định thứ tự các tập lệnh được chạy. Bạn cần chọn một tập lệnh lớn hơn tập lệnh khác nếu bạn muốn tập lệnh được chạy lần cuối; iii) Runlevel 0 không phải để khởi động lại! ; Đó là để tắt máy. 6 là để khởi động lại. iv) tập lệnh không có doanh nghiệp trong các /etc/rcN.dthư mục. Thay vào đó họ nên ở trong /etc/init.dliên kết với /etc/rcN.d.
terdon

14

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/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, 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/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

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_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

1
Mặc dù bài đăng của bạn là chính xác, tôi khuyên bạn nên cải thiện nó bằng cách thêm ví dụ về cách các bước như vậy có thể được thực hiện với các hệ thống. Xin vui lòng cho tôi biết khi bạn chỉnh sửa bài viết của bạn. Cảm ơn và chào mừng bạn đến với AskUbfox
Sergiy Kolodyazhnyy

Xin chào Serg, ý bạn là những ví dụ như trong bài đăng được liên kết hay bạn có ý tưởng gì khác không? Thứ hai, tôi không chắc chắn làm thế nào để "cho bạn biết" vì tôi không thể tìm thấy cơ chế liên hệ với người dùng SO khác.
Giăng 9631

Có, bạn có thể cung cấp một ví dụ giống như trong bài đăng khác của bạn. Chỉ nói "đi đến liên kết khác" là không tốt và làm cho câu trả lời của bạn trông lười biếng. Ngoài ra, để liên hệ với người dùng SO khác, hãy sử dụng @ trước tên người dùng, ví dụ @Serg
Sergiy Kolodyazhnyy

Cải thiện nhiều. Rất tốt, theo kịp các công việc tốt!
Sergiy Kolodyazhnyy

1
theo man systemd.unitcác tệp do người dùng tạo có thể được đặt trong $XDG_CONFIG_HOME/systemd/uservà các vị trí người dùng cục bộ khác
Antonios Hadjigeorgalis
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.