{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Courier New;}{\f1\fswiss\fcharset0 Arial;}} {\*\generator Msftedit 5.41.15.1507;}\viewkind4\uc1\pard\f0\fs20 #!/usr/bin/perl\par # Purpose: Starts a command only if it is not already running\par \par use strict; use warnings;\par \par my $Usage = "Usage: $0 command args\\n Runs command if not already\par running\\n";\par my @cmd = @ARGV or die $Usage;\par my $cmd_line = "@cmd";\par die "Command line too long: $cmd_line\\n" if length $cmd_line > 4095;\par \par my ($user,$header) = get_uid_from_ps();\par my $count = 0;\par foreach (`ps -efww`) \{ # This has a limit of 4096 bytes for CMD\par my ($who,$pid,$cmd) = (split /\\s+/,$_,7)[0,1,6];\par next unless $who eq $user and $cmd =~ /\\Q$cmd_line\\E$/;\par next if $pid == $$;\par print STDERR " $user is running '$cmd_line'\\n$header" unless $count++;\par print STDERR $_;\par \}\par print STDERR " count = $count\\n" if $count > 1;\par exit 1 if $count;\par print "$cmd_line\\n";\par exec @cmd;\par \par sub get_uid_from_ps \{\par my @ps = `ps -fp $$`;\par my @cols = split ' ',$ps[0];\par $_ = "UID PID PPID C STIME TTY TIME CMD";\par die "'@cols' != '$_'" unless "@cols" eq $_;\par @cols = split ' ',$ps[1];\par ($cols[0], $ps[0]);\par \}\par \par \f1\par }