[gelöst] Einzeiler mit find, exec und grep

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
slubitz
Beiträge: 5
Registriert: 19.11.2010 10:54:38

[gelöst] Einzeiler mit find, exec und grep

Beitrag von slubitz » 19.11.2010 11:04:15

Hallo zusammen,

ich versuche mich gerade an einem Einzeiler und habe ein kleines Problem damit.
Ich möchte alle sg devices in /dev überprüfen, um herauszufinden, hinter welchem sich der Storage Changer versteckt.
Leider bekomme ich als output auch noch jede Menge andere Zeilen von den devices, hinter denen der Changer nicht steckt.
Kann ich das irgendwie filtern?

folgenden Code habe ich :

Code: Alles auswählen

find /dev -name sg* -exec mtx -f {} status \; | grep 'Storage Changer'
Der Ouput sieht folgendermaßen aus:

root@backup02:~# find /dev -name sg* -exec mtx -f {} status \; | grep 'Storage Changer'
Storage Changer /dev/sg9:2 Drives, 47 Slots ( 3 Import/Export ) <-- nur das möchte ich haben, den Rest nicht
mtx: Request Sense: Long Report=yes
mtx: Request Sense: Valid Residual=no
mtx: Request Sense: Error Code=70 (Current)
mtx: Request Sense: Sense Key=Illegal Request
mtx: Request Sense: FileMark=no
mtx: Request Sense: EOM=no
mtx: Request Sense: ILI=no
mtx: Request Sense: Additional Sense Code = 20
mtx: Request Sense: Additional Sense Qualifier = 00
mtx: Request Sense: Field in Error = 00
mtx: Request Sense: BPV=no
mtx: Request Sense: Error in CDB=yes
mtx: Request Sense: SKSV=yes
mtx: Request Sense: Field Pointer = 00 00
READ ELEMENT STATUS Command Failed
mtx: Request Sense: Long Report=yes
mtx: Request Sense: Valid Residual=no
mtx: Request Sense: Error Code=70 (Current)
mtx: Request Sense: Sense Key=Illegal Request
mtx: Request Sense: FileMark=no
mtx: Request Sense: EOM=no
mtx: Request Sense: ILI=no
mtx: Request Sense: Additional Sense Code = 20
mtx: Request Sense: Additional Sense Qualifi

Grüße,
Stefan
Zuletzt geändert von slubitz am 19.11.2010 15:57:08, insgesamt 1-mal geändert.

123456
Beiträge: 6126
Registriert: 08.03.2003 14:07:24

Re: Einzeiler mit find, exec und grep

Beitrag von 123456 » 19.11.2010 12:17:51

in dem Fall einfach ein "| head -n 1" hinter dran hängen?

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Einzeiler mit find, exec und grep

Beitrag von ThorstenS » 19.11.2010 12:27:36

oder awk nutzen:

Code: Alles auswählen

find /dev -name sg* -exec mtx -f {} status \; | awk '/Storage Changer/'

slubitz
Beiträge: 5
Registriert: 19.11.2010 10:54:38

Re: Einzeiler mit find, exec und grep

Beitrag von slubitz » 19.11.2010 12:30:48

@ub13
Wäre eine Idee, wobei ich:
1. nicht garantieren kann, das es immer die erste Zeile ist und
2. immer noch die restlichen ausgaben der nachfolgenden exec befehle habe

Auch mit awk habe ich die ausgabe der restlichen exec befehle. Ich denke, das ist das eigentliche Problem.
Ich sollte es irgendwie hinbekommen, nur dann eine Ausgabe zu erhalten, wenn tatsächlich der Changer gefunden wurde und das ich bei den restlichen Devices einfach keine Ausgabe bekomme.

Hilft also leider nicht :-(
Zuletzt geändert von slubitz am 19.11.2010 12:34:57, insgesamt 1-mal geändert.

gxyz
Beiträge: 202
Registriert: 26.07.2010 13:54:21
Lizenz eigener Beiträge: MIT Lizenz

Re: Einzeiler mit find, exec und grep

Beitrag von gxyz » 19.11.2010 12:32:45

... zugegebenermaßen nicht direkt eine Antwort auf Deine Frage (etwas mehr als eine Zeile ;-), aber ich verwende für einen ähnlichen Zweck das u.a. Perl-Script um unterhalb von /dev/scsi Symlinks zu allen 'generischen' SCSI-Geräten aufgeschlüsselt nach Typ anzulegen. Als Ergebnis ist dann z.B. der 1. gefundene Changer als "/dev/scsi/changer0" erreichbar, Bandlaufwerke als "/dev/scsi/tape0" etc. (Voraussetzung ist, dass in dem Kernel die Option "CONFIG_SCSI_PROC_FS" aktiviert ist, was normalerweise der Fall ist)

Code: Alles auswählen

my $dst_dir="/dev/scsi";	  # directory for creating the symlinks
my $proc_file="/proc/scsi/scsi"; # where to find scsi information

mkdir $dst_dir unless (-d $dst_dir);
die "no directory: $dst_dir\n" unless (-d $dst_dir);
for my $f (<$dst_dir/*>) {    (-l $f) && unlink $f; }

open STDIN, $proc_file or die "can't open $proc_file: $!\n";
my ($tape_count,$disk_count,$count,$chg_count,$other_count)=(-1,-1,-1,-1);
my ($host,$channel,$id,$lun);
my ($vendor,$model,$rev);
my ($type,$scsi_rev);
while (<>) {
    next if /^Attached devices:/;
    if (/^Host: +scsi(\d+) +Channel: +(\d+) +Id: +(\d+) +Lun: +(\d+)/) {
	($host,$channel,$id,$lun) =($1,$2,$3,$4);
	$count++;
    } elsif (/^ +Vendor: +(.+[^ ]) +Model: +(.+[^ ]) +Rev: +(.+)$/) {
	($vendor,$model,$rev) =($1,$2,$3);
    } elsif (/^ +Type: +(.+[^ ])  +ANSI +SCSI revision: +(.+)$/) {
	($type,$scsi_rev) = ($1,$2,$3);
	my $name='';
	if ($type eq "Direct-Access") {
	    $disk_count ++;
	    $name="$dst_dir/disk$disk_count";
	} elsif ($type eq "Sequential-Access") {
	    $tape_count ++;
	    $name="$dst_dir/tape$tape_count";
	} elsif ($type eq "Medium Changer") {
	    $chg_count ++;
	    $name="$dst_dir/changer$chg_count";
	} else {
	    $other_count ++;
	    $name="$dst_dir/other$other_count";
	}
	# last line for entry, create some more info
	symlink("/dev/sg$count",$name);
	symlink("$vendor $model", ($name . '_') );
    } else {
	warn "???: $_\n";
    }
}

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Einzeiler mit find, exec und grep

Beitrag von ThorstenS » 19.11.2010 12:37:40

Unter squeeze habe ich kein /proc/scsi/scsi. Hier würde es helfen unter /sys/class/scsi_tape zu suchen

Hier mal die Ausgabe für ein einfaches LTO Laufwerk:

Code: Alles auswählen

$ ls /sys/class/scsi_tape
nst0  nst0a  nst0l  nst0m  st0  st0a  st0l  st0m

slubitz
Beiträge: 5
Registriert: 19.11.2010 10:54:38

Re: Einzeiler mit find, exec und grep

Beitrag von slubitz » 19.11.2010 12:41:19

Das ist fürwahr ein bisschen mehr als eine Zeile ;-)
Mal sehen ob ich das dementsprechend für mich passend umbauen kann.

gxyz
Beiträge: 202
Registriert: 26.07.2010 13:54:21
Lizenz eigener Beiträge: MIT Lizenz

Re: Einzeiler mit find, exec und grep

Beitrag von gxyz » 19.11.2010 13:00:12

ThorstenS hat geschrieben:Unter squeeze habe ich kein /proc/scsi/scsi. Hier würde es helfen unter /sys/class/scsi_tape zu suchen
Um auf einem neueren System via sysfs nur das sg-device des (mutmaßlich einzigen) Changers zu finden, sollte so 'was hier klappen:

Code: Alles auswählen

sg=`find  /sys/bus/scsi/drivers/ch -type l`
dev_no=`cat $sg/generic/dev | cut -d : -f 2`
dev=/dev/sg${dev_no}
bzw. wenn's ein Einzeiler werden soll:

Code: Alles auswählen

dev="/dev/sg$(cut -d : -f 2 < `find  /sys/bus/scsi/drivers/ch -type l`/generic/dev)"
wobei's dann vielleicht geistreicher wäre, gleich über eine entsprechende udev-Regel dafür zu sorgen, dass das Ding über einen feststehenden Gerätenamen zu erreichen ist ...

slubitz
Beiträge: 5
Registriert: 19.11.2010 10:54:38

Re: Einzeiler mit find, exec und grep

Beitrag von slubitz » 19.11.2010 14:18:59

Hallo,
Die udev regel wird natürlich auch noch eingetragen. Ich wollte nur schnell mit einer Zeile herausfinden auf welchem Device er sich befindet. Und das wollte ich dann in die Installations Doku schreiben. Damit wirklich JEDER das Device finden kann :-)

slubitz
Beiträge: 5
Registriert: 19.11.2010 10:54:38

Re: Einzeiler mit find, exec und grep

Beitrag von slubitz » 19.11.2010 15:32:12

Gelöst habe ich meinen eigentlichen Wunsch jetzt so:

Code: Alles auswählen

find /dev -name sg* -exec mtx -f {} status 2> /dev/null \; | awk '/Storage Changer/'
Danke für eure Hilfe :-)

gxyz
Beiträge: 202
Registriert: 26.07.2010 13:54:21
Lizenz eigener Beiträge: MIT Lizenz

Re: [gelöst] Einzeiler mit find, exec und grep

Beitrag von gxyz » 19.11.2010 17:15:45

... allerdings solltest Du Deine Lösung nur in einer ziemlich klar definierten Umgebung praktizieren, denn Du schickst da ja erst 'mal aufs Geratewohl sämtlichen SCSI-Geräten ein Kommando , das eigentlich nur für Changer definiert ist - kaputtgehen wird davon zwar nichts, allerdings dürften sich viele Gerätetreiber im Syslog darüber beschweren (und damit in etwaigen Monitoring-Systemen für einen Fehlalarm sorgen)

Antworten