通过事件执行shell脚本的方法

通过事件执行shell脚本的方法

有没有办法通过事件而不是时间(cron)触发shell脚本?例如,当磁盘已满时,它将运行 shell 脚本来删除旧日志。

就像在 Windows 中一样,任务调度程序会根据事件触发。

答案1

如果事件被通知给 DBUS,您可以使用 dbus-monitor 编写系统事件脚本。您必须研究文档,看看您想要编写的脚本是否将事件发布到 DBUS 才能使用此方法。

有关 DBUS 的更多信息,请参见此处:https://www.freedesktop.org/wiki/Software/dbus/

当 DBUS 不可用时,另一种可行的方法是编写您自己的守护进程来充当后台并定期检查您正在查找的事件。例如,我有自己的低磁盘空间守护程序,该守护程序在我的系统上运行,它将更改我的 shell 提示符以提醒我注意这种情况。

这是其中的一个片段,可以给您一个想法:

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 {} +

相关内容