Virtlab:Linuxové okénko
Z VirtlabWiki
Verze z 09:00, 15. 9. 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: | + | ==Realizace kritické sekce v Bash== |
- | + | ||
+ | <pre> | ||
LOCKFILE=$SPOJ_DIR/spojovac.lock | LOCKFILE=$SPOJ_DIR/spojovac.lock | ||
Řádka 28: | Řádka 48: | ||
fi | fi | ||
# Opsano z http://www.davidpashley.com/articles/writing-robust-shell-scripts.html | # 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ů | + | ==MUTEX promocí UNIXových semaforů== |
- | + | ||
Vytvoření, použití a smazání semaforu (spustit jako první) | Vytvoření, použití a smazání semaforu (spustit jako první) | ||
<pre> | <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> | </pre> | ||
Synchronizace se semaforem (spustit poté) | Synchronizace se semaforem (spustit poté) | ||
<pre> | <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> | </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)
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