[precedente] KDE - Copertina - Indice [successivo]

Articoli


Ecco i tips di questo mese.

MBR

In molte situazione è conveniente avere a disposizione copia del Master Boot Record (ad esempio per cancellare il LILO dal MBR stesso). Esistono vari modi per copiare avere una copia del MBR, ma il modo più semplice è sicuramente:

dd if=/dev/hda of=MBRbackup bs=512 count=1

E per rimetterlo al suo posto:

dd if=MBRbackup of=/dev/hda bs=512 count=1

GREP

Questi tips (che fanno la stessa cosa) si rendono molto utili quando si cerca una certa parola in una serie di file via comando GREP, ma quest'ultimo risponde con "argument list is too long":

ls -f|grep "\.c$"|xargs -n 1000 grep var_name
ls | xargs -i -t grep var_name {}

PROGRAMMAZIONE - PID

Specialmente quando si programma con le socket si rende molto spesso necessario sapere se un certo PID è ancora attivo. I metodi per scoprire se il pid è ancora presente nel sistema sono molti, ma 2 su tutti fanno al caso dei programmatori.

Il primo si basa sul file system /proc/ che, come molti sanno, una pseudo copia del kernel e di quello che la macchina sta eseguendo.
In questo caso basta solamente controllare se nella directory /proc/ esiste una directory chiamata con il numero del PID di cui stiamo controllando l'esistenza.

Il secondo è molto più semplice e veloce: basta tentare di uccidere il processo tramite la funzione kill (man 2 kill) passandogli come numero di segnale lo 0, che non viene riportato nel file /usr/include/asm/signal.h. Come si può vedere dalla pagina di manule della funzione kill, questa ritorna un intero, che sarà il nostro modo per controllare se il PID esiste ancora. Infatti se il valore ritornato è uguale a 0 allora il PID è ancora in esecuzione, mentre un altro valore vorrà dire che il PID non esiste più.

SCARICARE UNA PAGINA HTML

Molte volte è utile scaricare dalla rete una certa pagina web. Questo si può fare in molti modi, tra cui eseguire un Browser grafico come Netscape, caricare la pagina e salvarla. Ma esistono anche modi molto più semplici e sbrigativi:

DIVISIONE VELOCE

Quando è necessario calcolare la divisione di 2 numeri si fa sempre affidamento sulla vecchia e cara calcolatrice manuale, anche se la stessa esiste anche per linux e si chiama "bc". Con questo semplice pipe si può facilmente calcolare il risultato della divesione di due numeri:

# echo "scale=2\n $foo / $bar" | bc

dove $foo e $bar contengono i numeri della divisione e "scale" rappresenta il numero di decimali della divisione. Ancora meglio se si crea uno script come questo:

#/bin/sh
echo "scale=2\n $1 / $2" | bc

PROGRAMMAZIONE - SEQUENZE DI ESCAPE

È spesso necessario, quando si creano programmi non grafici, disporre di alcune funzioni che puliscano lo schermo o che posizionino il cursore in un certo posto. Per ovviare a questo problema si può usare la libreria ncurses con tutti i pro e i contro del caso, ma si possono anche usare le sequenze di escape, che sono sempre di più messe nel dimenticatoio, anche perchè cambiano da TERM a TERM. Ad esempio, per pulire lo schermo (o un xterm) si può usare:

printf("/033[2J");

PATCH RH5.0 e aha152x

Ecco la traduzione di un messaggio trovato in rete:

From registry@clear.net.nz Mon Apr 20 21:16:36 1998
Date: Thu, 12 Feb 1998 21:50:52 GMT
From: Registry 
Newsgroups: alt.os.linux, comp.os.linux.setup, linux.redhat.list,
    linux.redhat.misc
Subject: Se avete problemi con la RedHat 5.0 e aha152x ecco una soluzione

Da James H.G. Redekop

Grazie James
=-=-=-=-==

Ho avuto una risposta dalla RedHAt sulla questione di aha152x con RH5.0.
Ecco cosa ho ricevuto, con alcune correzioni:

Fatemi sapere se ci sono problemi. 
 
 Inserire il floppy di installazione 
 e digitare al prompt di boot:
 
 linux rescue
 
 Dopo un paio di schermate che chiedono informazioni sull'hardware 
 vedrete il prompt di root (#). Dovrete montare la partizione di Linux
 come in questo esempio (cambiate le partizioni a seconda di come sono
 impostate sulla vostra macchina).
 
 mkdir /mnt
 mkdir /fix

 Ora monteremo la partizione di root del vostro hard disk, quella che
 normalmente è /. Nel nostro esempio è /dev/sda2, ma per il vostro 
 sistema sarà diversa. 
 
 mount /dev/sda2 /mnt
 
 gunzip < /mnt/boot/initrd-2.0.31.img > /mnt/tmp/image
 
 gunzip /modules/loop.o
 insmod loop.o

*
* Dovrebbe essere insmod /modules/loop.o
*
* Fate
*
* ln -s /mnt/dev/loop0 /dev/loop0

 /mnt/bin/mount -o loop /mnt/tmp/image /fix
 
 vi /fix/linuxrc
 
 correggete le linee di insmod in modo da avere gli argomenti 
 corretti in corrispondenza di quelli corrotti e salvate le modifiche.
 
 sync
 umount /fix
 gzip < /mnt/tmp/image > /mnt/initrd-2.0.31.img

*
* Dovrebbe essere
*
* gzip < /mnt/tmp/image > /mnt/boot/initrd-2.0.31.img
*

 lilo -v -r /mnt
 umount /mnt
 reboot

LOGOUT SE INATTIVO

È spesso necessario che dopo un certo tempo di inattività si possa scollegare un utente per liberare una possibile shell. Per fare questo ci sono 2 metodi: settare la variabile AUTOLOGOUT con il numero di minuti prima che l'utente venga scollegato automaticamente (vale per la tcsh) o creare uno script come questo:

From froess@nregh0.nospam Mon Apr 20 21:24:42 1998
Date: Wed, 11 Feb 1998 12:39:09 -0600
From: Travis Froess 
Newsgroups: comp.unix.admin
Subject: Re: Logout Inactive Users

Ecco lo script che usiamo sui nostri server HP

#
# idle time user kick out
#
#set -x

limit=`echo $1 | tr -d`
who -u | while read user port month day time idle pid therest
do
        idle=`echo $idle | tr -d ":"`
        if [ "$idle" = "old" ]
        then
                idle="1000000"
        fi
        if [ $idle -gt $limit ]
        then
              date >> /tmp/iklog
              echo "user $user idle $idle > limit of $limit">>/tmp/iklog
              echo "  killing pid = $pid" >> /tmp/iklog
              kill -1 $pid 2>/dev/null
        fi
done

Va messo in cron perché sia eseguito ogni tanto. Ecco la voce di cron:
0 7,15,23   * * *   /utils/bin/idleko 8:00
--
==================================================================
| Travis (I am not giving my email address any more) Froess      |
==================================================================

RH5.0 e Staroffice 4.0. Parte 1

Direttamente dalla rete.

Installazione di StarOffice

Per iniziare avete bisogno di correggere il problema della libc. La prima cosa a cui fare attenzione qui è:

NON INSTALLARE LA "LIBRERIA LIBC AGGIORNATA"!! PUÒ INCASTRARE IL SISTEMA! Se già lo avete fatto, beh, potete pensare di reinstallare il sistema per correggere l'errore. Anche se installando l'rpm StarOffice funzionerà ho sentito diverse storie horror sul fatto che distrugge altre applicazioni. Quindi, NON LO FATE!

Procuratevi l'ultima libc5 (i file tar, non l'rpm!). Io ho usato la libc5.4.44 (la 5.4.38 è la minima versione richiesta per StarOffice). Estraete il file tar in una directory temporanea, e copiate "solo" libc e libm nella directory definitiva (io ho usato /usr/local/StarOffice/lib... non li mettete nelle normali directory delle librerie), ed impostate i link appropriati:

 
        ln -s libc.so.5.4.44 libc.so.5
        ln -s libm.so.5.0.9 libm.so.5

per produrre i seguenti link:

       libc.so.5 -> libc.so.5.4.44
       libm.so.5 -> libm.so.5.0.9

Questi sono gli unici due file della distribuzione libc di cui avete bisogno. Il resto può anche essere cancellato. Notate che i numeri della versione possono essere diversi.

Ora modificate /etc/ld.so.conf ed aggiungeteci come ultima linea:

/usr/local/StarOffice/lib (o dove le avete messe)

Trovo che così sia più affidabile, e che causi meno problemi che usare LD_LIBRARY_PATH...

Poi usate ldconfig per impostare le modifiche.

A questo punto lo script di setup di StarOffice dovrebbe funzionare. Notate che dovete usare lo script di setup, e non il programma (ho visto gente provarci). Quindi digitate:

/StarOffice/bin/setup

Se setup non funziona ancora (non so immaginare perché, ma...: modificate /StarOffice/bin/setup in modo che risulti così (non dovreste farlo con gli altri cambiamenti fatti a ld, ma non si sa mai :))

################################
#!/bin/sh
#
# StarOffice setup script
# (c) 1997, Star Division GmbH

cd `dirname $0`
sd_archive_path=`pwd`
sd_setup_binary=setup.bin
sd_platform=`uname -s`

# alcune piattaforme hanno bisogno di un path addizionale per le librerie
# condivise di X11
case $sd_platform in
  SunOS)
         LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/openwin/lib
         export LD_LIBRARY_PATH
         ;;
  Linux)
        LD_LIBRARY_PATH=/usr/local/StarOffice/lib
        export LD_LIBRARY_PATH
        ;;
      *)
         ;;
esac

        export SAL_FONTPATH XPPATH

# esegue il binario di setup 
exec $sd_archive_path/$sd_setup_binary $*
###########################

I cambiamenti rilevanti sono nella LD_LIBRARY_PATH per l'installazione di Linux. Ciò viene gestito da ld nel precedente passo, quindi non dovrebbe essere necessario, ma l'ho incluso per sicurezza... Dopo aver finito il setup, dovrete fare alcuni cambiamenti per farlo funzionare bene.

Finito il setup, copiate la seguente lista di directory da /StarOffice/.sofficerc nella vostra home directory (per precisione, ho creato una directory StarOffice nella mia home, ed ho messo la roba di StarOffice lì: evita conflitti e mantiene le cose pulite):

       /StarOffice/agent
                       .../backup
                       .../cache
                       .../database
                       .../explorer
                       .../autotext
                       .../basic
                       .../config
                       .../desktop
                       .../wordbook

Ricordatevi di copiare le sottodirectory completamente usando cp -r <dir> in modo da copiare tutti i file in esse contenuti.

A questo punto la mia directory di lavoro è di questo tipo:

       $HOME/StarOffice/agent
                       .../backup
                       .../cache
                       .../database
                       .../explorer
                       .../autotext
                       .../basic
                       .../config
                       .../desktop
                       .../wordbook

POI... (siete già stanchi?)

Copiate il file <inst dir>/StarOffice/.sofficerc nella vostra home directory.

Bisogna modificare il file .sofficerc che sta nella vostra home directory. In particolare bisogna cambiare la sezione [Directories-Unix] im modo che diventi così (potete copiarlo ed incollarlo, e poi eliminare le voci originali):

[Directories-UNIX]
 Agent-Dir=$(user)/StarOffice/agent
 Autopilot-Dir=$(user)/StarOffice/config/wizard
 Backup-Path=$(user)/StarOffice/backup
 Basic-Path=$(user)/StarOffice/basic
 Bitmap-Path=$(user)/StarOffice/config/symbol
 Bookmark-Dir=$(user)/StarOffice/explorer/bookmarks
 Cache-Dir=$(user)/StarOffice/cache
 Config-Dir=$(user)/StarOffice/config
 Database-Path=$(user)/StarOffice/database
 Desktop-Dir=$(user)/StarOffice/desktop
 Dictionary-Path=$(user)/StarOffice/wordbook
 Explorer=$(user)/StarOffice/explorer
 Gallery-Dir=$(inst)/gallery
 Glossary-Path=$(user)/StarOffice/autotext
 Graphics-Path=$(inst)/gallery
 Help-Dir=$(inst)/help
 Modules-Path=$(inst)
 New-Dir=$(user)/StarOffice/config/new
 Palette-Path=$(inst)/config
 Template-Path=$(inst)/template
 Trash-Dir=$(user)/StarOffice/explorer/trash
 Work-Path=$(user)/StarOffice/explorer/Work folder

Ora dobbiamo creare un nuovo <install dir>/StarOffice/.sofficerc fatto così (tenete l'originale come template per gli utenti):

[Directories-UNIX]
Sub-Ini=$(user)/.sofficerc
Modules-Path=$(inst)/bin
Basic-Path=$(inst)/bin
Template-Path=$(inst)/bin/Vorlagen

[soffice-View-UNIX]
5931Window=V1,0/694/1015/25,V,0,0
6308Window=V1,156/93/187/195,V,0,AL:(4,16,0/0/187/195)
0ExplDocView=,0,50,0,60,40
1ExplDocView=,0,50,0,60,40
0Browser-Sets=EXPFLD;1,0,A,4,290,85,115,115
0SplitWindow=V1,0,1,0,6308
2SplitWindow=V1,0,0
1SplitWindow=V1,0,0
3SplitWindow=V1,0,0
App-Window=4,25,1014,737;0
6318Window=V1,105/269/394/130,H,0,AL:(8,16,0/0/394/130)
/usr/local/StarOffice-ExpViewSet=1,0,A,4,290,85,115,115
2331Dialog=204/158/0/0,2340
3095Dialog=226/215/0/0,3096
10000Dialog=339/262/0/0

[soffice-PickList-UNIX]
0Hist=file://$(inst)/;;file:///usr/local/StarOffice/;
1Hist=file://$(inst)/README;swriter4:
Text;file:///usr/local/StarOffice/README;
2Hist=file://$(inst)/document/;Explorer:
dummy;file:///usr/local/StarOffice/document/;

[soffice-WorkingSet-UNIX]
ExplorerRoot=file://$(inst)/

Queste due modifiche ai file .sofficerc permettono all'applicazione di girare come applicazione multiutente. Per default è a utente singolo, cosa che ritengo inaccettabile per un sistema operativo multiutente!

La modifica finale consiste nel modificare il vostro file .profile ed aggiungere <install dir>/StarOffice/bin al path.

Ecco fatto!

Uno dei primi test per controllare il funzionamento della cosa è, all'avvio, di scegliere "File+New". Dovrebbe venire fuori un menù molto carino che contenga una selezione ragionevole dei tipi di documento. Se vi esce qualcos'altro, o se crasha, c'è qualcosa che non va. Tornate indietro e controllate se avete copiato tutte le directory, ed avete reimpostato correttamente i permessi.

L'altra cosa che può accadere è che dobbiate modificare la variabile $(inst) nella sezione [Dir...] qui sopra e sostituirla con $(sb_inst). Sembra che sia leggermente diversa. Saprete se state facendo la cosa giusta se non vi vengono le selezioni giuste nei menù.

In bocca al lupo! Anche se non è un'installazione automatica di 10 minuti, come la vorremmo, non è poi così brutta come sembra. Se siete nei guai, mandatemi una mail a:

tibbetts@oz.net

e vedrò se vi posso aiutare!

DISCLAIMER: La procedura qui sopra descritta non è approvata dalla StarDivision, e l'utente fa le modifiche suggerite a proprio rischio. Non sarò in alcun modo responsabile per qualsiasi danno che ne possa risultare.

di Richard Tibbetts

RH5.0 e Staroffice 4.0. Parte 2

E se non dovesse funzionare ecco un'altra versione:
Date: 12 Mar 1998 12:54:02 +0100
Newsgroups: it.comp.linux
Subject: Re: Star Office

--> "P" == Pierpaolo writes:

P> Dopo aver scompattato il file tgz si ottiene una directory con
P> all'interno, fra l'altro, uno script di setup. Come da istruzioni
P> sull'installazione, eseguo lo script. Si apre una finestra di
P> installazione in puro stile Windows, ma appare subito una finestrella
P> che segnala un errore alla linea 1 dello script: 
P> "line1: syntax error at
P> token 'l' expected declarator; i.e. File..."

Ormai e` una FAQ, visto che tutti ci sbattono contro... :-)

NOTA: quello che segue e` di fatto una traduzione di
		  http://www.waldherr.org/soffice4.shtml.

1. Scompattare SO 4.0 in una directory e  decidere dove installarlo 
(ad es. /usr/local/Office40);

2. procurarsi le libc e libm aggiornate (ad es. dal mio sito FTP, se  non 
le trovate altrove: ftp://ftp.gest.unipd.it/pub/linux/new-libc.tar.gz);
gia` che ci siamo,  nella stessa directory c'e`  anche soffice-setup.sh,
shell script da sostituire  al "setup" nella directory di  installazione
(di fatto questo si limita ad aggiungere una  definizione per la
variabile LD_LIBRARY_PATH che punta a /usr/local/Office40/lib);

3. copiare  libc.so.5.4.38  e libm.so.5.0.9  in  /usr/local/Office40/lib,
   entrare in detta directory dare i comandi
        ln -s libc.so.5.4.38 libc.so 
        ln -s libc.so.5.4.38 libc.so.5 
        ln -s libm.so.5.0.9  libm.so 
        ln -s libm.so.5.0.9  libm.so.5

4. come *root*, lanciare X11, aprire un  xterm, andare  nella directory di
   installazione e dare "./setup /net"  (*occhio*  al parametro!), e usare
   come directory di destinazione "/usr/local/Office40";

5. finita l'installazione, un bel "chmod -R  go+r /usr/local/Office40" non
   guasta, per esser sicuri di avere i permessi giusti;

6. infine, per *ogni* utente che vuole usare SO 4.0, entrare come  tale,
   lanciare X11, ecc., e eseguire "/usr/local/Office40/bin/setup"  (NON
   quello della directory di installazione, che si puo` eliminare in toto,
   e SENZA  "/net"); scegliere "Installation from Net or CD" e proseguire;
   al termine, e` opportuno aggiungere "/usr/local/Office40/bin" al PATH.

NOTA: se sono solo una o due persone ad usare SO 4.0, i circa 10 MB 
pro ca-pite copiati in ~/Office40 non hanno molta importanza; se gli 
utenti sono parecchi, pero`, potrebbe essere opportuno usare lo script 
di Michael Hoennig (della stessa StarDivision) di cui parla nella FAQ 
per SO 4.0 
(http://www.on-line.de/~michael.hoennig/soffice4-linux-faq-01.html),    
che consente di occupare solo circa 650 KB a testa.

Saluti,
Luca Polo.

GETCH SENZA CURSES

Ecco una semplice funzione in C per ottenere che la frase "Premere un tasto per continuare" funzioni anche senza utilizzare librerie aggiuntive, come ad esempio la ncurses.
: qualcuno mi potrebbe mandare del codice C per la 'versione unix' di 
: getch() SENZA usare la libreria curses?? (sono poco pratico sulle cose 
: grafiche di unix)

Chiama la seguente funzione... funziona correttamente sotto sunos4, sunos5, HPUX. Per ciascuna versione di UNIX dovresti modificare i file #include.

#include 
#include 
#include 

no_wait()
{
    int fd , i;
    struct termio test;

/* sostituisce ttyname(0) con il nome del terminale se necessario*/

    fd=open(ttyname(0),O_WRONLY);

    ioctl(fd, TCGETA, &test);
    test.c_cc[VMIN]=1;
    test.c_lflag = ISIG;
    ioctl(fd, TCSETA, &test);

    close(fd);
}

GREP E PIÙ ARGOMENTI

Molte volte è necessario cercare una parola all'interno del file, e si usa il tanto eclatato grep. Ma se le parole da cercare sono più di una? Beh, si usa ancora grep con l'opzione -e (leggere le man pages serve sempre!!!). Quindi:

grep -e parola1 -e parola2 nome_file

UTENTI CANCELLATI E FILE ANCORA ESISTENTI

Quando si cancella un utente è quasi sempre necessario controllare anche se esistono file che sono ancora di proprietà dell'utente stesso. Per fare questo basta utilizzare il comando find con la seguente sintassi:

find / -user 5000 -exec chown xxxx {} \;

In questo caso si fa semplicemente un chown, ma si può anche cancellare il file (rm) o spostarlo in una certa directory, e al posto di usare il UID dell'utente si può usare la login stessa.

SOSTITUIRE UNA PAROLA IN UN FILE

Ecco un semplice script che sostituisce una certa parola con un'altra.

#!/bin/ksh
#
# Sostituisce una stringa in uno o più file.
# I. Cnudde
#

echo

if [[ $1 = '-help' ]]; then

  echo "Uso: sr    [ ...]"
	
else
  
  echo "Sto sostituendo tutte le istanze di '$1' con '$2' nei file indicati."
  echo "..."
  
  OLD_STRING=$1
  NEW_STRING=$2
  #
  # per tutti i file ($3, $4...), sostituisce OLD_STRING con NEW_STRING
  # 'i' è usato per sapere quali parametri sto processando
  #

  i=1
  for FILE in "$@"; do
	
  	if [[ `expr $i` > 2 ]]; then
	  
	  echo "Processing $FILE..."
	  sed s/"$OLD_STRING"/"$NEW_STRING"/g $FILE > $FILE.tmp
	  mv $FILE.tmp $FILE

	fi
	
	i=`expr $i + 1`
	
  done
  
  echo "Fatto!"
fi

echo

I Trucchi/Consigli presentati sono stati creati in parte da me (ziobudda@chiara.dei.unipd.it) e in parte presi direttamente dai vari newsgroups su linux e su unix, un vero mare di consigli.
Per ogni informazione su questi tips contattare help@pluto.linux.it

[precedente] KDE - Copertina - Indice [successivo]