#!/usr/sbin/dtrace -s /* * woof.d - Bark whenever new processes appear. Needs /dev/audio. * Written in DTrace (Solaris 10 3/05). * * $Id: woof.d 3 2007-08-01 10:50:08Z brendan $ * * USAGE: woof.d & * * SEE ALSO: /usr/dt/bin/sdtaudiocontrol # to set volume * * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. * * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at Docs/cddl1.txt * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * CDDL HEADER END * * 14-Aug-2006 Brendan Gregg Created this. * 14-Aug-2006 " " Last update. */ #pragma D option quiet #pragma D option destructive #pragma D option switchrate=10hz inline int SCREEN_OUTPUT = 0; /* Set to 1 for screen output */ /* barks prevents woof.d from barking too much (up to 20 barks/second) */ int barks; dtrace:::BEGIN { SCREEN_OUTPUT ? trace("Beware of the dog!\n") : 1; } /* * Call the shell to run a background audioplay command (cat > /dev/audio * doesn't always work). One problem this creates is a feedback loop, * where we bark at our own barks, or at other dogs barks; entertaining * as this is, it can really slog the system and has been avoided by * checking our ancestory. */ proc:::exec-success /!progenyof($pid) && barks++ < 2/ { SCREEN_OUTPUT ? trace("Woof! ") : 1; system("audioplay /usr/share/audio/samples/au/bark.au &"); } profile:::tick-10hz { barks = 0; }