FreeBSD Server - sed Problem

nepda

nepda

Foren As
Hallo,

ich möchte einige Dateien (zu viele um sie von Hand zu bearbeiten) mit einem Script bearbeiten. Genauer von der aktuellen Kodierung in UTF-8 konvertieren.
Dazu habe ich bisher folgendes zusammengeschrieben:
Code:
#!/bin/sh
# charset.sh

to="UTF-8"

for i in `cat phpdateiliste.txt`; do
	type=`file -i "$i" | sed 's/.*charset=\(.*\)$/\1/'`
	iconv -f "$type" -t "$to" "$i" > "${i}.${to}"
	echo "Type: $type"
done
auf meinem Lokalen System (Ubuntu) funktioniert das auch ohne Weiteres. Doch wenn ich das auf dem Server ausführe kommt eine Meldung:
Code:
# ../charsets.sh 
../charsets.sh: Cannot fork: Resource temporarily unavailable
Type:
D.h. ich gehe davon aus, dass der Fehler im sed Befehl liegt. Jedoch wenn ich nur file -i /pfad/zu/einer/fixen/datei.php | sed 's/.*charset=\(.*\)$/\1/' ausführe, bekomme ich das Gewünschte.

Ich habe leider nicht besonders viel Ahnung von Shell Scripten. Wo könnte der Fehler genau liegen, bzw. wie könnte ich das Problem umgehen?

uname -a vom Server:
Code:
FreeBSD *** 6.2-RELEASE-p3 FreeBSD 6.2-RELEASE-p3 #3: Tue Mar 27 15:43:45 CEST 2007     *** amd64

Vielen Dank!
 
Glaub nicht, das es an sed liegt, wenn
Code:
file -i /pfad/zu/einer/fixen/datei.php | sed 's/.*charset=\(.*\)$/\1/'
ausführbar ist.

Ich hab hier mal eine Variante mit awk, vllt geht das:

Code:
file -i /pfad/zu/einer/fixen/datei.php | awk -F"charset=" '{print $2}'
 
/bin/sh ist in heutigen Systemen meist ein Link auf eine POSIX-Kompatible shell, nicht aber die bourne-shell selber. Bei ubuntu sollte es die dash sein. Poste mal Ausgabe von "ls -l /bin/sh". (Bei bsd ksh oder gar csh? *brrr*)

Aber das sollte eigentlich nicht das Problem sein. (Ist aber trotzdem gut zu wissen.)

Cannot fork: Resource temporarily unavailable
Ich weiß nicht ob forken der korrekte Term dafür ist, aber command-substitutions (und pipes) werden ja in einer Subshell ausgeführt, welche die env-Vars der Eltern shell erbt. Und da du ja sagst, dass es ohne die backticks geht, wird da wohl der Hase im Pfeffer liegen (und niesen).

Vielleicht liegst an "ulimit -u"? kA ehrlich gesagt, ich meine nur, das fork-Bomben in freebsd bei "oem-einstellung" (jaja, kein besseres Wort eingefallen...) nicht möglich sind. Aber da bombt ja forkig erstmal eh nix Großartiges in deinem Skript. Und das dir memory ausgeht um zwei subshells zu starten kann ich irgendwie auch nicht glauben ._.

Eine Sache noch: type ist ein shell-builtin, also eine denkbar schlechte Wahl für einen Variablen-Namen (nimm lieber "from", das passt dann auch zu "to").
 
Zuletzt bearbeitet:
@aspire_5652: bei deiner Lösung bekomme ich den gleichen Fehler, nur bricht er die Schleife nach dem ersten Durchlauf ab.

@Gott_in_schwarz: so ganz versteh ich nicht, was du sagen willst :think:
Ich hab dir mal die Ausgaben:

Code:
# ls -l /bin/sh
-r-xr-xr-x  1 root  www  131320 Mar 18  2007 /bin/sh

 - und -

# ulimit -u
5

ahja, hab die Variable mal umbenannt in fromtype.... ändert nichts an der Sache.
 
Code:
# ulimit -u
[b]5[/b]
Ich wage die These aufzustellen, dass hier das Problem liegt.
Mach mal "ulimit -a", dann siehst du auch, was der Wert von "ulimit -u" dir sagen will.
Wie man den Wert dafür ändert entnehme bitte einer entsprechenden google-Suche.
Die zu editierende Datei heißt zum Beispiel in ubuntu
Code:
/etc/security/limits.conf
Könnt in freebsd genauso heißen, könnte auch wieder nicht.

ahja, hab die Variable mal umbenannt in fromtype.... ändert nichts an der Sache.
Ich hab auch nicht gesagt, dass das den Fehler verursacht. Ich habs nur als schlechten Stil angemerkt.
 
Hehe

das ist gut, abgesehen davon, dass ich mich zur Zeit nichtmal am Server anmelden kann (per ssh):
Received disconnect from [ip].[wird].[nicht].[verraten]: 2: fork failed: Resource temporarily unavailable
glaube ich kaum, dass ich an diese Datei drankomme geschweige denn ändern darf. Bei dem Server handelt es sich um einen der Goneo Internet GmbH...
Ich denke da hilft nur alle Dateien runterladen, konvertieren und wieder hochladen (ich frage mich eh grad, warum ich nicht schon viel früher auf diese Idee gekommen bin :headup:)

Soweit mal vielen Dank an euch zwei!
 
liegt auch vielleicht daran, dass FreeBSD ein anderes sed benutzt als Linux

schau dir mal gsed (gnu sed) an:

Code:
/usr/ports/textproc/gsed

das ist die GNU Variante, die auch Linux benutzt. FreeBSD benutzt ein eigenes sed aus dem Basissystem.

GNU's sed hat AFAIK erweiterte Funktionen

Grüße
Whopper
 
whopper schrieb:
liegt auch vielleicht daran, dass FreeBSD ein anderes sed benutzt als Linux
Liegt auch vielleicht daran, dass du den Thread nicht gelesen hast. Nicht mal das (so sollte man meinen) obligatorische Initialpost:
Jedoch wenn ich nur file -i /pfad/zu/einer/fixen/datei.php | sed 's/.*charset=\(.*\)$/\1/' ausführe, bekomme ich das Gewünschte.
Und dann:
Code:
Cannot fork: Resource temporarily unavailable
Gerade bei der Fehlermeldung finde ich es seltsam wieso die Leute hier auf sed tippen.
 

Ähnliche Themen

Zeilen kopieren mit SED

JBidWatcher: Problem bei loading Auctions in Verbindung mit mySQL

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

Windows clients können nicht mehr auf lange laufendes System zugreifen

X not starting anymore since filesystem was full

Zurück
Oben