Sao chép tập tin kích hoạt khi chèn thiết bị (không phụ thuộc vào systemd)


0

Tôi muốn tự động để một số tệp tạo thành một thiết bị lưu trữ được sao chép khi chèn. Tôi đang tìm cách sử dụng một và cùng một phương thức trên cả hai hệ thống sử dụng systemd và system sử dụng init script (ví dụ: OpenRC trên Gentoo). Ngoài ra, tôi sẽ tìm cách không phá vỡ tính năng tự động.

Tôi tập hợp từ nhiều câu hỏi khác liên quan đến vấn đề này rằng điều này được thực hiện tốt nhất thông qua udev và nó gần như hoạt động, nếu không phải là udev posthook bein được thực thi nghiêm ngặt trước autoount (theo cách mà udev kiểm tra trạng thái thoát của bất kỳ tập lệnh nào nó được gọi và bất kỳ kịch bản nào mà script gọi, theo một số quy trình mà theo tôi trông giống như ma thuật):

Việc thực thi tập lệnh hoạt động, chỉ là tập tin không thể được sao chép, bởi vì (tôi tin) trình kích hoạt automount chờ tập lệnh sao chép hoàn thành trước:

chymera@quiethost ~/.repositorg/transfer $ cat /etc/udev/rules.d/95-local.rules 
ACTION=="add", KERNEL=="sd?1", ENV{ID_FS_UUID}=="4C3D-8BCB", RUN+="/bin/su chymera -c /home/chymera/.repositorg/transfer/4C3D-8BCB.sh"
chymera@quiethost ~/.repositorg/transfer $ cat 4C3D-8BCB.sh 
#!/usr/bin/env bash

touch ~/lalax.txt
cp "/run/media/chymera/NIKON D750/lala.txt" ~/
chymera@quiethost ~/.repositorg/transfer $ ls ~/lal*
/home/chymera/lalax.txt
chymera@quiethost ~/.repositorg/transfer $ ls /run/media/chymera/NIKON\ D750/
DCIM  lala.txt  NIKON001.DSC

Thêm giấc ngủ và chuyển hướng thực thi tập lệnh sang một khung con, dường như không hoạt động. Các tập tin không thể truy cập được, vì bây giờ automount bị ức chế hoàn toàn:

chymera@quiethost ~/.repositorg/transfer $ cat /etc/udev/rules.d/95-local.rules 
ACTION=="add", KERNEL=="sd?1", ENV{ID_FS_UUID}=="4C3D-8BCB", RUN+="/bin/su chymera -c /home/chymera/.repositorg/transfer/_4C3D-8BCB.sh"
chymera@quiethost ~/.repositorg/transfer $ cat _4C3D-8BCB.sh 
#!/usr/bin/env bash

nohup /bin/bash /home/chymera/.repositorg/transfer/4C3D-8BCB.sh & exit
chymera@quiethost ~/.repositorg/transfer $ cat 4C3D-8BCB.sh 
#!/usr/bin/env bash

touch ~/lalax.txt
sleep 5
cp "/run/media/chymera/NIKON D750/lala.txt" ~/
chymera@quiethost ~/.repositorg/transfer $ ls ~/lal*
/home/chymera/lalax.txt
chymera@quiethost ~/.repositorg/transfer $ ls /run/media/chymera/

Câu trả lời:


1

Điều này là không thể (hoàn toàn) thực hiện chỉ với udev, vì udev chỉ phát lại sự kiện "thêm thiết bị" sau khi tất cả các quy tắc và tất cả công nhân đã hoàn thành trên thiết bị đó. (Và sự kiện là những gì kích hoạt automount, nói chung.)

Thay vì phản ứng với các thiết bị, bạn muốn phản ứng với gắn kết mới :

#!/usr/bin/env bash

wanted_dir="/run/media/chymera/NIKON D750"

findmnt -o action,target -r -n --poll |
    while read -r eaction etarget; do
        if [[ "$eaction" == mount && "$etarget" == "$wanted_dir" ]]; then
            cp this that etc.
        fi
    done

Vì vậy, tôi thêm điều này như một dịch vụ và giữ cho nó chạy liên tục? Mặc dù vậy, tôi vẫn đang tự hỏi làm thế nào udev có thể theo dõi các quá trình mồ côi bắt đầu từ nhân viên của mình (ngay cả trong các lớp con).
TheChymera
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.