#!/usr/bin/perl -w use strict; use POSIX qw(setgid setsid setuid); my $i; my $pid; my @user; my $dmon_id="furrypop"; my $outfile="/export/home/furrypop/daemon.out"; &write_log("Start"); chdir '/' or die "Can't chdir to /: $!"; open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; open STDOUT, '>/dev/null' or die "Can't write to /dev/null: $!"; defined($pid = fork) or die "Can't fork: $!"; if ($pid) { # parent-only processing follows... &write_log("Parent"); sleep 10; } else { # child-only processing follows... # switch the ID under which the child is running setsid or die "Can't start a new session: $!"; @user=getpwnam($dmon_id); if (@user) { # setuid $user[2] or die "Cannot switch ID to $dmon_id: $!"; # setgid $user[3] or die "Cannot switch group for $dmon_id: $!"; $< = $user[2]; $> = $user[2]; $( = $user[3]; $) = $user[3]; } else { die "Invalid user ID ($dmon_id)"; } &write_log("Child"); sleep 10; } sub write_log { open(OUTFILE, ">>$outfile") or die "Cannot open file $outfile : $!"; print OUTFILE "$_[0] pid $$\n user real $< effective $>\n group real $( effective $)\n"; close OUTFILE; }