Zamykanie pliku pod Linuxem z poziomu konsoli

0

Otwieram plik domyślnym programem za pomocą komendy: xdg-open.
Chciałbym go teraz zamknąć też z poziomu terminala. Czy jest to możliwe w jakiś sposób?

Chodzi mi tutaj najlepiej o jakieś delikatne zamknięcie, tak aby po uruchomieniu jeszcze raz prezentacji program nie pytał mnie czy chce odzyskać dane(pomimo tego że nic nie zostało zmienione).

0

@marmite: nie da się, bo xdg-open nie jest sam w sobie programem do otwierania plików, a programem, który odpala inny program bazując na typie MIME/URI podanym jako argument.

0

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;

0

Da się to obejść, możesz zamknąć aplikację, która ten plik otworzyła. Musisz wykryć, jaka to aplikacja np, przez fuser i wysłać jej polecenie zakończenia. Bezpośredniego sposobu nie ma, tak jak napisano wyżej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1