Điểm:1

cách thực thi tập lệnh khi tắt máy cho wmctrl -l?

lá cờ cn

hệ thống: Ubuntu 20

[Đơn vị]
Mô tả=Chạy tập lệnh khi bắt đầu và dừng

[Dịch vụ]
Loại=oneshot
RemainafterExit=true  
ExecStop=/home/user/same_test

[Cài đặt]
WantedBy=multi-user.target

same_test:

#!/bin/sh
kiểm tra tiếng vang >> home/user/same_test_echo.txt (hoạt động)
wmctrl -l >> /home/user/same_test.txt (không hoạt động)

Kết quả là:

  • same_test.txt trống (không hoạt động)
  • same_test_echo.txt chứa thử nghiệm (hoạt động)
guiverc avatar
lá cờ cn
Ubuntu 20? Vậy đây là hệ thống Ubuntu Core 20? vì chúng thường không có đầu. (Các bản phát hành Ubuntu sử dụng định dạng *năm* là các sản phẩm khác với các hệ thống *năm.tháng* phổ biến hơn nhiều, tức là 20 != 20,04)
Điểm:0
lá cờ in

Tùy chọn 1 - Kiểm tra PATH

Bước đầu tiên là xem liệu vấn đề nằm ở vị trí của các lệnh:

$ loại -a tiếng vang

echo là một shell dựng sẵn
tiếng vang là /bin/echo

$ gõ -a wmctrl

wmctrl là /usr/bin/wmctrl

Các tiếng vang lệnh được tích hợp vào trình bao và cũng nằm trong /thùng rác thư mục, đó là thư mục phổ biến nhất cho các chương trình.

Các wmctrl lệnh nằm trong /usr/bin thư mục có thể không phải là một phần của systemd của bạn CON ĐƯỜNG.

Vì vậy, tương tự như câu hỏi này:

Giải pháp là thêm một dòng vào dịch vụ systemd:

[Dịch vụ]
Môi trường=PATH=/home/someUser/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Một tùy chọn khác là mã hóa cứng thư mục cho lệnh khi bạn gọi nó: /usr/bin/wmctrl.


Lựa chọn 2 - WantedBy=multi-user.target

GHI CHÚ: Đây là tùy chọn chung cho những người khởi động và không áp dụng cho Tắt giống như OP đang làm.

Nếu đường dẫn không phải là vấn đề, bước tiếp theo là kiểm tra MuốnBy Tùy chọn:

Câu trả lời ở đó giải thích:

Lưu ý rằng Wants hoặc WantedBy chỉ nói rằng hệ thống sẽ khởi động một dịch vụ bất cứ khi nào một dịch vụ hoặc mục tiêu khác cũng được khởi động, nhưng nó không chỉ định gì về thứ tự khởi động/tắt. Nếu bạn cần dịch vụ B đang chạy khi dịch vụ A khởi động, bạn cần thêm Before=A.service vào tệp B.service để chỉ định rõ ràng phụ thuộc thứ tự khởi động.

Hãy xem xét thực tế rằng GUI thậm chí có thể không chạy khi tập lệnh của bạn được chạy. Vì vậy, không có cửa sổ cho wmctrl -l báo cáo.

Nếu đây là vấn đề Sau đó (trong khi khởi động) chứ không phải MuốnBy là một giải pháp có khả năng.


Tùy chọn 3 - Sử dụng /bin/true

Từ các nhận xét trong phần Hỏi & Đáp này:

Thay thế:

RemainafterExit=true

Với:

RemainafterExit=/bin/true

Ghi chú: thật là một nội trang hệ vỏ và một lệnh:

$ loại -a đúng
true là một nội dung shell
đúng là /bin/true
Igor Shumakov avatar
lá cờ cn
Tôi nghĩ vấn đề là dịch vụ chạy khi tắt máy sau khi tất cả các ứng dụng và có thể đã đóng gui. Tôi đã thử: Before=graphical.target nhưng không được Làm cách nào để chạy dịch vụ trước khi tất cả các ứng dụng và gui đóng khi tắt máy/khởi động lại?
WinEunuuchs2Unix avatar
lá cờ in
@IgorShumakov Đây là một số bài đọc bổ sung trong khi tôi tìm hiểu sâu hơn một chút để có sự phù hợp hoàn hảo: https://unix.stackexchange.com/questions/284598/systemd-how-to-execute-script-at-shutdown-only-not- lúc khởi động lại
Igor Shumakov avatar
lá cờ cn
Cảm ơn. Dịch vụ đang thực thi khi tắt máy nhưng vấn đề là wmctl -l vẫn trống

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.