Kiedyś napisałem taki skrypt w perlu. Ma pewne wady (nie poprawiałem bo jest wystarczający dla moich potrzeb) ale ogólnie działa.
Może ci się przyda.
#!/usr/bin/perl -w
use strict;
use warnings;
sub get_pid{
my $file_name = shift;
open my $HANDLE, '-|',"ps -T" or die "Error ps -T\n"; #get all pids from terminal tree
my $ret;
while(my $var = <$HANDLE>){$ret = $var unless $var =~ /ps/;} #get last process pid
die "I cant find process!\n" unless defined $ret;
if($ret =~ /^(\d+)/){$ret = $1;}else{die "I Cant find process pid \n";} #check if is number
return $ret;
};
sub kill_window_pid{
my $pid = shift;
open my $HANDLE ,'-|',"xdotool search --pid $pid" or die "Error xdotool search";
my $window_id;
while(my $var = <$HANDLE>){if($var =~ /\d+/){$window_id=$var;}} #get last window id
die "I Cant find Window ID\n" unless defined $window_id;
print `xdotool windowactivate $window_id`; #set window to active state
print `xdotool key alt+F4`; #alt+f4
};
sub open_file{
my $file_name = shift; #get arg
my $pid = open my $HANDLE, "|xdg-open $file_name"; #open process with file ptr and get pid
die "I cant open the file: $file_name\n" unless defined $pid; #check if all good
};
sub my_main{
if($#ARGV == 0){ #one argument
my $arg = join('\\',split(//,$ARGV[0])); #backslashing all chars
open_file($arg); #run process
#TODO
sleep(10); #wait for something
my $pid = get_pid; #get process id
kill_window_pid($pid); #kill window
return;
}
die "Insert: $0 <file_name>\n";
};
my_main;