저는 Linux 과정을 위한 실습을 하고 있고 선생님은 Systemd에 대해 가르치고 있습니다.
다음을 사용하여 특정 장치가 설치될 때 스크립트를 시작하는 서비스를 만드는 방법: mount /dev/xvdc1 /mnt/backup
내가 시도한 것
- 타이머를 사용하여
/mnt/backup
마운트 지점인지 확인합니다. (선생님은 그것을 받아들이지 않을 것입니다. 그것은 엄격하게 이벤트 중심이어야 합니다) - .mount 단위를 생성하고 .service 단위에 .mount 단위가 필요하도록 만듭니다. 이 접근 방식은 명령을 실행할 때 스크립트를 시작하지 않습니다.
mount /dev/xvdc1 /mnt/backup
나는 이것에 잘못된 방식으로 접근하고 있다고 생각합니다. 이것은 실험실 문제입니다.
/mnt/backup
"한 번 설치되면 rsync를 사용하여 모든 파일을 복사하는 유닛 파일을 생성합니다/dev/xvdc1
."
알아요:
- 설치될 장치는 항상
/dev/xvdc1
- 장치의 마운트 지점은 항상
/mnt/backup
/dev/xvdc1
마운트된 기반으로 서비스를 시작해야 합니다.
이것은 내 .service 단위 파일입니다.
[Unit]
Description=Starts a backup for /dev/xvdc1 when mounted using the mount command.
[Service]
Type=simple
ExecStart=/root/backupscript.sh
ExecStop=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
답변1
장치를 시작하기 전에 ConditionPathExists=를 사용하여 파일 존재 조건을 확인하십시오. 지정된 절대 경로 이름이 없으면 조건이 실패합니다. ConditionPathExists=에 전달된 절대 경로 이름 앞에 느낌표("!")가 붙으면 테스트가 무효화되고 경로가 존재하지 않는 경우에만 장치가 시작됩니다.
ConditionPathIsMountPoint= ConditionPathExists=와 유사하지만 경로가 존재하고 탑재 지점인지 확인합니다.
가장 쉬운 방법은 다음을 포함하는 것 같습니다.
ConditionPathIsMountPoint=/mnt/backup
당신 [Unit]
측에서. 이것이 확인되지는 않지만어느백업 생성과 관련하여 사용자가 까다롭지 않을 수도 있지만 장치는 여기에 설치됩니다.
Restart=on-failure
서비스 시작을 계속 시도 해야 할 수도 있습니다 .
보다 정확한 접근 방식은 udev
특정 장치가 설치될 때 서비스를 시작하는 규칙을 작성하는 것입니다.
먼저 lsusb에서 장치를 찾으세요. ID를 적어두세요(예: 0a81:0101)
sudoedit /etc/udev/rules.d/100-mount-videos.rules를 통해 /etc/udev/rules.d/에 새 udev 규칙 파일을 생성하고 다음과 같이 새 규칙을 추가합니다.
ACTION=="추가",ATTRS{idVendor}=="0a81",ATTRS{idProduct}=="0101",RUN+="/home/your_username/bin/mount_videos.sh"
또는 귀하가 말하는 다른 서비스 RUN+=
로 대체할 수 있습니다.RUN+=/usr/bin/systemctl start backup.service