時間(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 {} +