시간(cron) 대신 이벤트를 통해 쉘 스크립트를 트리거하는 방법이 있습니까? 예를 들어 디스크가 가득 차면 쉘 스크립트를 실행하여 오래된 로그를 삭제합니다.
Windows와 마찬가지로 작업 스케줄러는 이벤트를 기반으로 트리거됩니다.
답변1
이벤트가 DBUS에 통보되면 dbus-monitor를 사용하여 시스템 이벤트를 스크립팅할 수 있습니다. 작성하려는 스크립트가 이 방법을 사용하기 위해 DBUS에 이벤트를 게시하는지 확인하려면 문서를 연구해야 합니다.
DBUS에 대한 자세한 내용은 여기에서 확인할 수 있습니다.https://www.freedesktop.org/wiki/Software/dbus/
DBUS를 사용할 수 없는 경우 또 다른 가능한 접근 방식은 배경 역할을 할 자체 데몬 프로세스를 작성하고 찾고 있는 이벤트를 주기적으로 확인하는 것입니다. 예를 들어, 이 상황을 경고하기 위해 쉘 프롬프트를 변경하는 디스크 공간 부족 데몬이 내 시스템에서 실행되고 있습니다.
다음은 아이디어를 제공하는 스니펫입니다.
declare LOWDISK='\033[38;05;160mLOWDISK\033[00m' ## Display in RED.
declare SLEEPFREQ=60 ## Check every 60 seconds
declare CHECKFILE=/tmp/__lowdisk__alerts__
declare LOWDISKFS=/tmp/__lowfs_diskspace__
### Daemonized
if [[ "${1}" =~ ^-d ]]; then
if ps -ef|awk -vPID=$$ '{if($2 !~ PID)print}'|grep -q -- '[l]owdiskspace_monitor.bsh -d'; then
echo "*** Warning: lowdiskspace_monitor.bsh - ALREADY STARTED, skipping.. "
else
while :; do
## Add your monitored disks here.
df -h / /mnt/adata1 /mnt/adata2 /mnt/pny1 /mnt/pny2 /mnt/samsung1 /mnt/samsung2 /mnt/samsung31 /mnt/samsung32 /mnt/seagate1 /mnt/seagate2 /mnt/seagate21 /mnt/seagate22 /mnt/mushkin1 /mnt/mushkin2 /var/host/media/removable/ELEMENT2_EXT4 /var/host/media/removable/Elements/ /var/host/media/removable/Elements_Ntfs2 /var/host/media/removable/ELEMENT_EXT4 2>"${DISCARD_DEV}" | uniq > "${CHECKFILE}"
## Check for at least a GIG ("G") in each mounted monitored volume. Change this if necessary.
awk '{if(($4 !~ /[0-9]+[.]?[0-9]*G/)&&(NR>1))print $6}' "${CHECKFILE}" > "${LOWDISKFS}"
sleep ${SLEEPFREQ}
rm "${LOWDISKFS}"
done
fi
fi
[[ -s "${LOWDISKFS}" ]] && echo -en "${LOWDISK}"
참고: 이를 사용하려면 파일에 저장하고 실행 가능하게 만든 다음 PROMPT_COMMAND
파일에 설정할 수 있습니다 .bashrc
.
답변2
주기적으로 실행되지만 조건이 충족되지 않으면 즉시 종료되도록 스크립트를 설정합니다.
예를 들어
#!/bin/sh
df "<mount point or device node or /var/log>" |
grep -q -e '100%' -e '9[5-9]%' ||
exit
find /var/log -type f -name "*old logs*" -exec rm {} +