Virtlab:Linuxové okénko

Z VirtlabWiki

(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
Verze z 11:04, 18. 8. 2007
Gry72 (Diskuse | příspěvky)

← Předchozí porovnání
Aktuální verze
Gry72 (Diskuse | příspěvky)

Řádka 1: Řádka 1:
-: seznam dobrych rad, osvedcenych postupu, a pod.+: linuxovy koutek, seznam dobrych rad, osvedcenych postupu, a pod.
-;Zaznam cinnosti na konzoli+==Konfigurujeme inetd (Pouziti inetd.conf)==
 +: prebrano z http://www.linux.cz/noviny/2001-02/clanek04.html
 + 
 +Konfigurace
 +Konfiguraci inetd čte ze souboru /etc/inetd.conf. Každý řádek obsahuje následující položky (všechny položky musí být vyplněny):
 + "service", "socket type", "protocol", "wait/nowait", "user[.group]", "server program" a "server program arguments".
 + 
 +Položka "service" udává jméno služby (viz soubor /etc/services, případně /etc/rpc).
 + 
 +Položka "socket type" udává typ socketu, což je nejčastěji "stream" (pro protokoly využívající spolehlivá spojení, např. TCP) anebo "dgram" (pro protokoly používající datagramy, např. UDP). Detaily viz např. manuálová stránka socket(2).
 + 
 +Položka "protocol" udává název protokolu ("tcp", "udp" nebo méně často "rpc/tcp" či "rpc/udp").
 + 
 +Položka "wait/nowait" je v případě služby používající protokol TCP vždy "nowait". V případě služby protokolu UDP záleží na tom, zda server uvolní socket a komunikuje s klientem přes nové spojení - v tomto případě může současně běžet více instancí serveru a použijeme volbu "nowait". V opačném případě server čte datagramy tak dlouho, dokud přicházejí a po uplynutí určité doby od přijetí posledního datagramu spojení (timeoutu) se ukončí - v tomto případě použijeme volbu "wait" (takto funguje např. talkd, démon služby talk anebo bootpd, démon služby bootps).
 + 
 +Položka user obsahuje jméno uživatele (případně i skupiny), pod kterým se bude daná služba spouštět.
 + 
 +Položka "server program" udává cestu k serveru dané služby. V případě interních služeb se zde uvádí "internal".
 + 
 +Položka "server program arguments" udává parametry, se kterými bude server dané služby spouštěn, s výjimkou interních služeb, kdy je tato položka prázdná. Uveďme si příklad konfigurace
 + 
 +==Zaznam cinnosti na konzoli==
: pokud delam praci pres konzoli(ssh) a chci to mit jako reprodukovatelny postup a zaroven jsem lenivy si vsechno psat co jsem udelal, tak existuje programek '''script''' ktery je schopen ''nahravat'' konzoli a k tomu je '''scriptreplay''' ktery umi ''nahravku'' prehrat : pokud delam praci pres konzoli(ssh) a chci to mit jako reprodukovatelny postup a zaroven jsem lenivy si vsechno psat co jsem udelal, tak existuje programek '''script''' ktery je schopen ''nahravat'' konzoli a k tomu je '''scriptreplay''' ktery umi ''nahravku'' prehrat
: ''programy v linuxu'': : ''programy v linuxu'':
: '''script''' - nahrava konzoli (ulozi do souboru nahravku) : '''script''' - nahrava konzoli (ulozi do souboru nahravku)
: '''scriptreplay''' - prehrava (cte ze souboru nahravku) : '''scriptreplay''' - prehrava (cte ze souboru nahravku)
- 
[http://www.davidpashley.com/articles/writing-robust-shell-scripts.html Psaní robustních shell skriptů] [http://www.davidpashley.com/articles/writing-robust-shell-scripts.html Psaní robustních shell skriptů]
 +
 +==Realizace kritické sekce v Bash==
 +
 +<pre>
 + LOCKFILE=$SPOJ_DIR/spojovac.lock
 +
 + # Implementace kriticke sekce s pouzitim LOCKFILE
 + # noclobber mode: redirection fails if (a regular) file to be written to exists
 + if ( set -o noclobber; echo "$$" > "$LOCKFILE") 2> /dev/null;
 + then
 + trap 'rm -f "$LOCKFILE"; exit $?' INT TERM EXIT
 + <CRITICAL SECTION>
 + rm -f "$LOCKFILE"
 + trap - INT TERM EXIT
 + else
 + echo "Failed to acquire LOCKFILE: $LOCKFILE."
 + echo "Held by $(cat $LOCKFILE)"
 + fi
 + # Opsano z http://www.davidpashley.com/articles/writing-robust-shell-scripts.html
 +</pre>
 +
 +==Regulární výrazy v Bash verze 3==
 +Porovnávání textu podle [http://cs.wikipedia.org/wiki/Regul%C3%A1rn%C3%AD_v%C3%BDrazy regulárních výrazů] a získání hodnot pro milovníky Perlu
 +Příklad vypíše '''52 ostrava'''
 +<pre>
 +$fname='52@ostrava'
 +if [[ "$fname" =~ '(\w+)@(\w+)' ]] ; then
 + device=${BASH_REMATCH[1]}
 + site=${BASH_REMATCH[2]}
 + echo "$device $site"
 +fi
 +</pre>
 +
 +==MUTEX promocí UNIXových semaforů==
 +
 +Vytvoření, použití a smazání semaforu (spustit jako první)
 +<pre>
 +#include <sys/types.h>
 +#include <sys/ipc.h>
 +#include <sys/sem.h>
 +#include <stdio.h>
 +#include <fcntl.h>
 +
 +extern int errno;
 +
 +int main(void) {
 +
 +struct sembuf sb;
 +key_t key;
 +int semid;
 +
 +if ((key=ftok ("/tmp/qqq", '1'))==-1) perror("FTOK:");
 +// zmenit soubor na neco rozumnejsiho z Virtlabu
 +
 +// create one semaphore with no special flags
 +if ((semid = semget (key,1,IPC_CREAT| O_RDWR | 0777))==-1) perror("A:");
 +
 +// set semaphore value to 1
 +sb.sem_num=0;
 +sb.sem_op=1;
 +sb.sem_flg=0;
 +if (semop (semid, &sb,1)==-1) perror("B:");
 +
 +// Wait until a mutex is released or proceed if it is free
 +// Decrease value by 1 before proceeding
 +
 +sb.sem_num=0;
 +sb.sem_op=-1;
 +sb.sem_flg=0;
 +printf("Waiting before semaphore\n");
 +if (semop (semid, &sb,1)==-1) perror("C:");
 +printf("Passed through semaphore. Waiting for input to release it.`\n");
 +
 +getc(stdin);
 +
 +// release mutex - increase value by 1
 +sb.sem_num=0;
 +sb.sem_op=1;
 +sb.sem_flg=0;
 +if (semop (semid, &sb,1)==-1) perror("D:");
 +printf("Semaphore released. Waiting for input to remove it\n");
 +
 +getc(stdin);
 +getc(stdin); // odstrani CR
 +
 +//remove the semaphore
 +if (semctl(semid,1,IPC_RMID)==-1) perror("E:");
 +printf("Semaphore removed\n");
 +return 0;
 +}
 +</pre>
 +
 +Synchronizace se semaforem (spustit poté)
 +<pre>
 +#include <sys/types.h>
 +#include <sys/ipc.h>
 +#include <sys/sem.h>
 +#include <stdio.h>
 +#include <fcntl.h>
 +
 +extern int errno;
 +
 +int main(void) {
 +
 +struct sembuf sb;
 +key_t key;
 +int semid;
 +
 +if ((key=ftok ("/tmp/qqq", '1'))==-1) perror("FTOK:");
 +// zmenit soubor na neco rozumnejsiho z Virtlabu
 +
 +// create one semaphore with no special flags
 +if ((semid = semget (key,1, 0777))==-1) perror("A:");
 +
 +// Wait until a mutex is released or proceed if it is free
 +// Decrease value by 1 before proceeding
 +
 +
 +sb.sem_num=0;
 +sb.sem_op=-1;
 +sb.sem_flg=0;
 +printf("Waiting before semaphore\n");
 +if (semop (semid, &sb,1)==-1) perror("C:");
 +printf("Passed through semaphore. Waiting for input to release it.`\n");
 +
 +getc(stdin);
 +
 +// release mutex - increase value by 1
 +sb.sem_num=0;
 +sb.sem_op=1;
 +sb.sem_flg=0;
 +if (semop (semid, &sb,1)==-1) perror("D:");
 +printf("Semaphore released\n");
 +return 0;
 +}
 +</pre>
 +
 +== Exim ==
 +
 +Odstraneni vsech zprav z fronty:
 + exim -bpru|awk {'print $3'}|xargs exim -Mrm
 +[[Kategorie:HOW-TO]]
 +[[Kategorie:C/Cpp]]

Aktuální verze

linuxovy koutek, seznam dobrych rad, osvedcenych postupu, a pod.

Obsah

Konfigurujeme inetd (Pouziti inetd.conf)

prebrano z http://www.linux.cz/noviny/2001-02/clanek04.html

Konfigurace Konfiguraci inetd čte ze souboru /etc/inetd.conf. Každý řádek obsahuje následující položky (všechny položky musí být vyplněny):

"service", "socket type", "protocol", "wait/nowait", "user[.group]", "server program" a "server program arguments".

Položka "service" udává jméno služby (viz soubor /etc/services, případně /etc/rpc).

Položka "socket type" udává typ socketu, což je nejčastěji "stream" (pro protokoly využívající spolehlivá spojení, např. TCP) anebo "dgram" (pro protokoly používající datagramy, např. UDP). Detaily viz např. manuálová stránka socket(2).

Položka "protocol" udává název protokolu ("tcp", "udp" nebo méně často "rpc/tcp" či "rpc/udp").

Položka "wait/nowait" je v případě služby používající protokol TCP vždy "nowait". V případě služby protokolu UDP záleží na tom, zda server uvolní socket a komunikuje s klientem přes nové spojení - v tomto případě může současně běžet více instancí serveru a použijeme volbu "nowait". V opačném případě server čte datagramy tak dlouho, dokud přicházejí a po uplynutí určité doby od přijetí posledního datagramu spojení (timeoutu) se ukončí - v tomto případě použijeme volbu "wait" (takto funguje např. talkd, démon služby talk anebo bootpd, démon služby bootps).

Položka user obsahuje jméno uživatele (případně i skupiny), pod kterým se bude daná služba spouštět.

Položka "server program" udává cestu k serveru dané služby. V případě interních služeb se zde uvádí "internal".

Položka "server program arguments" udává parametry, se kterými bude server dané služby spouštěn, s výjimkou interních služeb, kdy je tato položka prázdná. Uveďme si příklad konfigurace

Zaznam cinnosti na konzoli

pokud delam praci pres konzoli(ssh) a chci to mit jako reprodukovatelny postup a zaroven jsem lenivy si vsechno psat co jsem udelal, tak existuje programek script ktery je schopen nahravat konzoli a k tomu je scriptreplay ktery umi nahravku prehrat
programy v linuxu:
script - nahrava konzoli (ulozi do souboru nahravku)
scriptreplay - prehrava (cte ze souboru nahravku)

Psaní robustních shell skriptů

Realizace kritické sekce v Bash

 LOCKFILE=$SPOJ_DIR/spojovac.lock
 
 # Implementace kriticke sekce s pouzitim LOCKFILE
 # noclobber mode: redirection fails if (a regular) file to be written to exists
 if ( set -o noclobber; echo "$$" > "$LOCKFILE") 2> /dev/null;
 then
   trap 'rm -f "$LOCKFILE"; exit $?' INT TERM EXIT
   <CRITICAL SECTION>
   rm -f "$LOCKFILE"
   trap - INT TERM EXIT 
 else
   echo "Failed to acquire LOCKFILE: $LOCKFILE."
   echo "Held by $(cat $LOCKFILE)"
 fi
 # Opsano z http://www.davidpashley.com/articles/writing-robust-shell-scripts.html

Regulární výrazy v Bash verze 3

Porovnávání textu podle regulárních výrazů a získání hodnot pro milovníky Perlu Příklad vypíše 52 ostrava

$fname='52@ostrava'
if [[ "$fname" =~ '(\w+)@(\w+)' ]] ; then
    device=${BASH_REMATCH[1]}
    site=${BASH_REMATCH[2]}
    echo "$device $site"
fi

MUTEX promocí UNIXových semaforů

Vytvoření, použití a smazání semaforu (spustit jako první)

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
#include <fcntl.h>

extern int errno;

int main(void) {

struct sembuf sb;
key_t key;
int semid;

if ((key=ftok ("/tmp/qqq", '1'))==-1) perror("FTOK:");
// zmenit soubor na neco rozumnejsiho z Virtlabu

// create one semaphore with no special flags
if ((semid = semget (key,1,IPC_CREAT| O_RDWR | 0777))==-1) perror("A:");

// set semaphore value to 1
sb.sem_num=0;
sb.sem_op=1;
sb.sem_flg=0;
if (semop (semid, &sb,1)==-1) perror("B:");

//  Wait until a mutex is released or proceed if it is free
//  Decrease value by 1 before proceeding

sb.sem_num=0;
sb.sem_op=-1;
sb.sem_flg=0;
printf("Waiting before semaphore\n");
if (semop (semid, &sb,1)==-1) perror("C:");
printf("Passed through semaphore. Waiting for input to release it.`\n");

getc(stdin);

// release mutex - increase value by 1
sb.sem_num=0;
sb.sem_op=1;
sb.sem_flg=0;
if (semop (semid, &sb,1)==-1) perror("D:");
printf("Semaphore released. Waiting for input to remove it\n");

getc(stdin);
getc(stdin); // odstrani CR

//remove the semaphore
if (semctl(semid,1,IPC_RMID)==-1) perror("E:");
printf("Semaphore removed\n");
return 0;
}

Synchronizace se semaforem (spustit poté)

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
#include <fcntl.h>

extern int errno;

int main(void) {

struct sembuf sb;
key_t key;
int semid;

if ((key=ftok ("/tmp/qqq", '1'))==-1) perror("FTOK:");
// zmenit soubor na neco rozumnejsiho z Virtlabu

// create one semaphore with no special flags
if ((semid = semget (key,1, 0777))==-1) perror("A:");

//  Wait until a mutex is released or proceed if it is free
//  Decrease value by 1 before proceeding


sb.sem_num=0;
sb.sem_op=-1;
sb.sem_flg=0;
printf("Waiting before semaphore\n");
if (semop (semid, &sb,1)==-1) perror("C:");
printf("Passed through semaphore. Waiting for input to release it.`\n");

getc(stdin);

// release mutex - increase value by 1
sb.sem_num=0;
sb.sem_op=1;
sb.sem_flg=0;
if (semop (semid, &sb,1)==-1) perror("D:");
printf("Semaphore released\n");
return 0;
}

Exim

Odstraneni vsech zprav z fronty:

exim -bpru|awk {'print $3'}|xargs exim -Mrm
Osobní nástroje