Nếu tôi hiểu bạn một cách chính xác, bạn muốn tạm dừng các máy VB của bạn trước khi phiên bash của bạn trên tty3 kết thúc hoặc trước khi Xserver của bạn kết thúc.
Tôi tin rằng systemd không biết về Xsession đang chạy của bạn, bởi vì bạn khởi động nó từ .bashrc của bạn, vì vậy sẽ rất khó để nói systemd tạm dừng VB của bạn trước khi nó chấm dứt shell của bạn hoặc Xsession của bạn. Bạn sẽ phải tìm một vị trí trong chuỗi tắt máy "đủ sớm", có thể khó tìm và nghi ngờ về mặt ngữ nghĩa, bởi vì nó sẽ trộn "công cụ người dùng" với "công cụ hệ thống"
Các giải pháp có thể phần nào phụ thuộc vào cách systemd chấm dứt các quy trình của bạn, nhưng ít nhất những điều sau đây phải theo hướng tốt:
Trước khi vỏ kết thúc
suspendVB() {
echo "suspending VBs"
# put real code here
exit
}
trap suspendVB EXIT
Nếu bạn thực hiện điều này là RCfile của bash của bạn (hoặc thêm nó vào .bashrc), thì mã trong suspendVB()
sẽ được thực thi trước khi shell kết thúc. Bạn có thể kiểm tra điều này bằng cách chạy
bash --rcfile xxx
nơi tập tin xxx
chứa mã từ trên. Điều này bắt đầu một shell khác bên trong shell hiện tại của bạn, chỉ để thử nghiệm. Khi bạn chạy một lối thoát đơn giản, bạn sẽ thấy:
martin@beaureve:~$ exit
exit
suspending VBs
/home/martin >
và bạn đã trở lại trong vỏ (đăng nhập) ban đầu của bạn.
Bạn có thể phải tìm hiểu làm thế nào systemd thực sự chấm dứt shell đăng nhập của bạn và bạn có thể phải thay thế EXIT
bằng một số tín hiệu khác. Tra cứu trap
lệnh để tìm hiểu thêm.
Lưu ý rằng khi systemd giết chết các tiến trình của bạn bằng "-9" (SIGKILL) thì bạn sẽ không thể bẫy được việc chấm dứt, tức là bạn đã hết may mắn.
Trước khi Xsession chấm dứt
Ngoài ra, bạn có thể thử một điều tương tự với Xsession của bạn. Điều này rất cần thiết trong trường hợp systemd chấm dứt Xsession của bạn trước khi nó kết thúc shell của bạn. Bạn có thể muốn chèn một cái bẫy vào một trong các tệp khởi động X (ví dụ: .xinitrc) - tra cứu các trang hướng dẫn startx
và xinit
tìm hiểu thêm.
Nếu startx
tệp của bạn trông giống như của tôi, thì xserver được khởi động ở nền trước và bạn có thể chỉ cần đặt các lệnh tạm ngưng của mình sau dòng X thực sự bắt đầu (và hoàn toàn không sử dụng bẫy):
xinit "$client" $clientargs -- "$server" $display $serverargs
retval=$?
echo " --- suspending VBs ---"
Tôi đặt dòng "đình chỉ VB" và khi tôi chạy, startx -- vt8
tôi nhận được phiên fullblows (kde) trên vt8 và chỉ khi tôi đăng xuất, dòng "đình chỉ VB" mới xuất hiện trên màn hình.