イベントを通じてシェルスクリプトを実行する方法

イベントを通じてシェルスクリプトを実行する方法

時間(cron)の代わりにイベントを介してシェルスクリプトをトリガーする方法はありますか?たとえば、ディスクがいっぱいになったら、シェルスクリプトを実行して古いログを削除します。

Windowsと同様に、タスクスケジューラはイベントに基づいてトリガされます。

答え1

イベントがDBUSに通知されたら、dbus-monitorを使用してシステムイベントをスクリプトできます。作成したいスクリプトがこの方法を使用するためにDBUSにイベントを公開していることを確認するには、文書を調べる必要があります。

DBUSの詳細については、こちらをご覧ください。https://www.freedesktop.org/wiki/Software/dbus/

DBUSが利用できない場合のもう1つの可能なアプローチは、バックグラウンドとして機能する独自のデーモンプロセスを作成し、探しているイベントを定期的にチェックすることです。たとえば、この状況を警告するためにシェルプロンプトを変更するディスク容量不足デーモンが私のシステムで実行されています。

以下はアイデアを提供するスニペットです。

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

関連情報