miércoles, 22 de abril de 2009

USANDO LA SHELL

Entendiendo la SHELL
El shell permite al usuario insertar comandos y luego interpretarlos en instructiones para el SO linux. Exiten diferentes tipos de shells cada una para cada necesidad del usuario, entre las comunes tenemos sh, csh, ksh;por defecto se utiliza bash. Para cambiar de shell:
$/bin/[shell]
Para retornar a la shell anterior:
$exit
$ ctrl + D
Cada shell tiene un archivo de conifguracion de recursos correspondidos (rc file) situado en /etc que contiene las configuracion globales de la shell.
$/etc/bash.bashrc
$/etc/csh.cshrc
Tambien cada usuario tiene un archivo de configuracion de la shell situado en:
$~/.bashrc
Para ver todas las shells del sistema
#cat /etc/shells
Con el comando chsh se puede cambiar la shell por defecto del usuario. Las opciones que pueden ser usadas son:

option Alternate Function
-s --shells Specifies the default login shell for this user
-l --list Lists the shells specified in the /etc/shells file
-u --help Displays the options for the chsh command
-v --version Displays version information for the shell

Para conseguir que csh sea el shell por defecto:
$chsh -s /bin/csh
Despues de ejecutar se pedira la contraseña del usuario.
*Root solo puede cambiar la shell de otro usuario.
Se sugiere borrar los shells de /etc/shells que no se van a utilizar para que los usuarios solo puedan ejecutar los scripts en el shell predeterminado.

Usando la linea de comando
La shell se presenta como una interfaz de linea de comando. En el shell prompt se escriben lineas de comandos que luego se interpretan por la shell y luego se envian al sistema. Usualmente los shell muestran el nombre de usuario, el nombre del equipo, y el directorio localizado.
v00w@laphome /home/v00w$
Uno puede cambiar las opciones del prompt configurando el rc file de la shell, si se usa bash entonces habria que editar /etc/bashrc.

Los comandos escritos no son directamente interpretados por la shell para ello se necesita presionar la tecla enter. Esto ayuda para que los comandos sean editados antes de pasar sobre el sistema, los comandos siguen una sintaxis especifica.
$command [options] [arguments]
Options son codigos con letras unicas que son precedidos por un guion (-), y modifican el efecto del comando. Se pueden usar multiples opciones en un mismo comando, y estos tambein pueden ser sensibles a minusculas y mayusculas.
*La opcion -R es muy importarte ya que el comando corre de manera recursiva a traves de los subdirectorios del directorio analizado.
$ls -F
amsn_received/ Desktop/ Images/ Pictures/ Videos/
bin/ Documents/ Music/ public_html/
*la opcion -F es para diferenciar los directorios de los archivos.

Se pueden escribir varios comandos usando punto y coma (;) donde el primer comando se ejecutara antes de proceder con el siguiente.
v00w@linux-fd8r:~> ls -F ~/; ls -F ~/Documents/
amsn_received/ Desktop/ Images/ Pictures/ Videos/
bin/ Documents/ Music/ public_html/
bookmarks.html* e-books/ Linux/ Networking/ Varios/
DIRECCIONES.txt* fia/ LPI-study material/ Notes-Blog/

Se puede seguir escribiendo comandos en mas de una linea si se usa backslash al final de un comando, este caracter especial permite que se ejecute un salto de linea ignorando la ejecucion del comando cuando se presiona la tecla enter. Esto es muy útil para comandos extensos.
$ls -F /etc \
ls -F \usr

La shell tiene la opción de finalización de un comando (command completion), donde solo basta escribir las primeras letras del comando y luego presionar la tecla TAB, para que el sistema complete el comando.
$dm
Si se presiona TAB, el sistema completara:
$dmseg

Readline Library
El bash shell permite editar comandos escritos antes de ejecutarlos. El editor usado para editar estos comandos es Readline Library, este edito corre por defecto sobre emacs. Readline Library permite facilmente arreglar errores en la secuencia de comando sin tener que volver a escriber la secuencia entera.
La siguiente tabla muestra las combinaciones de tacla y las funciones de cada una de ellas:

Key Combination Function
Ctrl-b Move back one character
Ctrl -f Move forward one character
Del Delete the character to the left of the cursor
Ctrl-d Delete the character underneath the cursor
Ctrl-a Move to the start of the line
Ctrl-e Move to the end of the line
Esc-f Move forward a word
Esc-b Move backward a word
Ctrl-l Clear the screen, reprinting the current line at the top
Ctrl-k Kill(delete the text from the current cursor position to the end of the line
Esc-d Kill from the cursor to the end of the current word, or if between words, to the end of the next word
Esc-Del Kill from the cursor the start of the previous word, or if between words, to the start of the previous word.
Ctrl-w Kill from the cursor to the previous white space. This differs from Esc-del because the boundaries separating words differs.

La Sustitución de Comando(comand substitution) permite usar la salida de un comando como argumento de otro, es necesario usar el caracter " ` ` "
$echo `pwd`
/home/v00w/

Historial de comando contiene una lista de comandos emitidos por el command prompt. La cantidad de comando almacenados es especificado por la variable de entorno HISTSIZE en /etc/profile o ~/.profile. El valor por defecto para esta variable es de 1000 entradas. El comando history muestra todas las entradas del archivo historial que es ~/.bash_history.
$echo $HISTSIZE
1000
$ls
$cd /etc
$history
1 $echo $HISTSIZE
2 ls
3 cd /etc
4 history
La variable HISTCMD es usada para proveer un número de indexación al siguiente comando que se correrá.
$echo $HISTCMD
6
$ls -F /bin
$history
1 $echo $HISTSIZE
2 ls
3 cd /etc
4 history
5 echo $HISTCMD
6 ls -F /bin
7 history
La variable HISTFILE contiene la locacion del comando history.
$echo $HISTFILE
/home/v00w/.bash_history
La variable HISTFILESIZE contiene el maximo numero de lineas contenidas en HISTFILE.
$echo $HISTFILESIZE
1000

La utilidad fc provee otra opcion para editar comandos en el archivo history antes de correrlos.La utilidad fc abre el comando sobre un editor predeterminado, donde se puede editar un rango de eventos del historial antes de correrlos en una sola vez.
$fc -l 2 6
2 ls
3 cd /etc
4 history
5 echo $HISTCMD
6 ls -F /bin

Variables de Entorno y configuraciones
Cualquier comando ejecutado es un proceso, los procesos pueden ser iniciados por los usuarios o por el mismo sistema operativo.Además, un proceso puede crear otro como parte de su ejecución.
Cada proceso tiene asociado un entorno, una seria de variables que definen ciertos parámetros para el proceso. El entorno es expresado como una lista de variables y sus valores; ambos, el nombre de la variable y el valor son representados como strings que puede ser compuestos por la mayoria de caracteres.Cuando un proceso hijo es creado, hereda el entorno de su proceso padre; entonces, un proceso hijo puede modificar su entorno antes de pasarlo a su propio proceso hijo.

La variable PATH indica que directorios ve el sistema para ejecutar un comando, si es que ningun directorio no es especificado en el comando. Las variables pueden ser configuradas para el sistema usando el comando export.
#PATH=/home/v00w/scripts
#export PATH
Para visualizar las configuracion de cualquier variable de entorno se usa el comando echo seguido de por el simbolo $ mas el nombre de la variable.
#echo $PATH
/home/v00w/bin:/usr/local/bin:/usr/bin:/home/v00w/scripts:

Editando la variable de entorno
Es bueno entender como se locacionan los comandos en el sistema. La variable PATH es usada por la shell para mirar donde pueden estar. Las locaciones comunes son /bin:/usr/bin:/usr/local/bin
Entonces, cuando uno ejecuta un comando tal como ls, primero lo busca en /bin, sino /usr/bin, y asi sucesivamente buscando por todas las variables configuradas en PATH. Esto es bien util porque permite ejecutar comandos sin saber toda la ruta exacta del comando.
Se puede cambiar el PATH de cualquier usuario iniciado sesion como root, editando /etc/profile y ajustando la linea PATH=.
#vi /etc/profile
Para cambiar la información de un usuario determinado, se debe modificar:
$vi /home/v00w/.profile

El proceso init y la variable PATH
init es el proceso padre de todos los procesos del sistema. Otros procesos heredan las variables de entorno del proceso init, y el PATH es la ruta init en el raro caso que ninguna ruta haya sido configurada.
La ruta init esta arreglada en la fuente del programa init como se muestra a continuación:
usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin
*Notar que la ruta init no contiene /usr/local/bin
Todos los programas que son ejecutados desde /etc/inittab funcionan en el entorno init, especialmente scripts de inicialización en /etc/init.d. Algunos ejemplos son programas como FTP, Samba

Prompt
El shel prompt puede ser configurado para mostrar información diversa. Para ver como esta configurado el prompt el sistema usa la variable de entorno PS1.
v00w@linux-fd8r:~> echo $PS1
$(ppwd \l)\u@\h:\w>
Donde v00w es el usuario, linux-fd8r es el nombre de la maquina y ~ es el pwd donde me encuentro.

Para personalizar el prompt uno puede editar /etc/bashrc como root e insertar casi cualquier texto dentro de las comillas.

Settings used to configure the Prompt
Setting Meaning
\u User name of the current user
\h The name of the computer running the shell(hostname)
\W The base of the name of the current working directory
\w The full name of the current working directory
\$ Displays "$" for normal users and "#"for the root
\! History number of the current command
\# Number of the current command
\d Current date
\t Current time
\s Name of the shell
\n New line
\\ Backslash
\[ Begins a sequence of nonprintable characters
\] Ends a sequence of nonprintable characters
\nnn The ASCII character corresponding to the octal number nnn
$(date) Output from the date command(or any other command for the matter)

HOME
La variable HOME es usada para representar el directorio personal del usuario. Este directorio es usualmente locacionado en /home/username. Asi que para el caso de mi computdora sera /home/v00w. Esta variable asi como todas las variables de entorno son uútiles con scripts. Todas las configuraciones del directorio personal para cada usuario estan contenidas en el archivo /etc/passwd.

Administrando Procesos
Cada vez que se ejecuta un comando en la shell, un proceso es creado. Cada proceso se le asigna un PID(process id number). Estos procesos se puede revisar con el comando ps, el cual realiza un reporte estatico de procesos que se estan ejecutando. El comando ps tiene varias opciones para poder mostrar las información de los procesos mas detallada.

Switches Used with ps
Switch Use
a Displays processes for all users
txx Displays processes within controlling terminal txx
u Displays user information for the process
l Displays in long format with detailed information
s Displays information in signal format
m Displays memory information
x Displays processes without a controlling terminal
S Displays CPU time and page faults of child processes

Para ver todos los procesos corriendo sobre el sistema

v00w@linux-fd8r:~> ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 1064 408 ? Ss 08:02 0:00 init [5]
root 2 0.0 0.0 0 0 ? S<>top
Tasks: 141 total, 1 running, 140 sleeping, 0 stopped, 0 zombie
Cpu(s): 16.8%us, 3.9%sy, 2.1%ni, 74.5%id, 2.6%wa, 0.1%hi, 0.0%si, 0.0%st
Mem: 3665028k total, 1241216k used, 2423812k free, 65720k buffers
Swap: 2104444k total, 0k used, 2104444k free, 628272k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4805 v00w 20 0 300m 15m 5924 S 8 0.4 3:29.52 yauap
2529 root 20 0 678m 55m 12m S 2 1.6 5:44.44 X
1 root 20 0 1064 408 348 S 0 0.0 0:00.94 init
2 root 15 -5 0 0 0 S 0 0.0 0:00.00 kthreadd
3 root RT -5 0 0 0 S 0 0.0 0:00.00 migration/0
4 root 15 -5 0 0 0 S 0 0.0 0:00.68 ksoftirqd/0
5 root RT -5 0 0 0 S 0 0.0 0:00.00 migration/1
6 root 15 -5 0 0 0 S 0 0.0 0:00.58 ksoftirqd/1

Hay veces que los procesos se para o no responden como deberian y deben ser terminados. esto puede ser hecho usando el comando kill.
#kill -s [signal process]
Signal Meaning
1 Hangup
2 Terminal Interrupt
3 Termina quit
6 Process abot
9 Kill(cannot be caught or ignored)
14 Alarm Clock
15 Termination
#kill -6 2952

Una lista de todas las señales disponibles pueden ser vistas usando la opcion -l:
v00w@linux-fd8r:~> kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

Los procesos pueden correr a diferentes niveles: foreground, background, zombies, stooped. Un proceso en foreground quiere decir que ningun otro proceso puede ser ejectuado si es que el proceso que esta corriendo no termina; al inverso de background, que menciona que varios procesos se pueden estar ejecutando mientras la shell esta libre para aceptar otros procesos.
Para iniciar un proceso en background:
#firefox &
Si hay un proceso corriendo en foreground se puede parar usando la combinación de teclas ctrl+Z(^Z), una vez que el proceso ha sido parado se puede reiniciar con el comango bg [job number]. El job number puede ser descubierto con el comando jobs, este comando mostrara todos los procesos que estan actualmente corriendo en modo background o stopped.
Tambin es posible llevar procesos del background al foreground, para esto usamos el comando fg [job number].
v00w@linux-fd8r:~> firefox
*** nss-shared-helper: Shared database disabled (set NSS_USE_SHARED_DB to enable).
^Z
[1]+ Stopped firefox
v00w@linux-fd8r:~> jobs
[1]+ Stopped firefox
v00w@linux-fd8r:~> bg 1
[1]+ firefox &
v00w@linux-fd8r:~> jobs
[1]+ Running firefox &
v00w@linux-fd8r:~> fg 1
*** nss-shared-helper: Shared database disabled (set NSS_USE_SHARED_DB to enable).

Modificando Prioridad con Procesos
Cualquier proceso que se corra tiene asignado un nivel de prioridad en el sistema. La prioridad por defecto es 0(cero), las prioridades varian sobre la escala -20 a 19. Las prioridades mas altas son usadas para hacer que los procesos corrar mas despacio mientras que prioridades mas bajas hacer que corran mas rapido.
Root solo puede asignar prioridades negativas, y pueden ser revisadas con el comando top.
El nivel de prioridad puede ser asignado cuando un proceso is ejecutado usando el comando nice:
#nice [priority][command]
#nice 10 firefox
Si se quiere cambiar el nivel de prioridad de un proceso que esta corriendo o asignar prioridades de proceso a un usario, usamos el comando renice:
-g Specifies the priority for processes executed by members of the specified group
-u, --user Specifies the priority level for the processes executed by the specified user
-p, --pid Specifies the priotity level for the specified process
-v, --version Print version.
-h, --help Print help.
v00w@linux-fd8r:~>firefox &
v00w@linux-fd8r:~> ps -a |grep firefox
7789 pts/1 00:00:25 firefox
v00w@linux-fd8r:~> renice 15 -p 7789
7789: old priority 10, new priority 15

Resumen de capitulo
  1. El shell usado por defecto sobre los sistemas Linux es el shell bashEste shell puede ser cambiado por el usuario. Sin embargo, scripts especificos deben ser escritos para la shell donde se va a correr; por lo tanto, cambiar shells deberia hacerse con cuidado.
  2. El shell bash permite comandos usando punto y coma ";". Además, los comandos pueden realizarse en diferentes lineas usando backslah "\"
  3. Los comandos se autocompletan pulsando la tecla TAB.
  4. El Readline Library permite editar comandos en la linea de comando usando el editor emacs.
  5. La substitución de comando(command sustitution) es usado para remplazar un comando con su salida.
  6. El historial de comando está almacenado en el archivo ~/.bash_history. El número de entradas almacenadas esta configurado por la variable HISTSIZE. Este archivo permite ver y editar comandos previamente ingresados.
  7. El comando fc permite editar entradas en el historial con el editor por defecto. Múltiples entradas pueden ser editadas al mismo tiempo.
  8. Las variables de entorno y configuraciones en los archivos /etc/profile y /etc/bash.bashrc configuran parámetros para el sistema entero. Si se desea configurar las variables para un usuario especifico, se editan los archivos ~/.profile y ~/.bashrc.
  9. La variable PATH contiene una lista de directorios para buscar comandos que son ingresados por la linea de comandos.
  10. La variable init path es usado por programas que se incian desde archivo /etc/initab.
  11. El shell prompt puede ser configurado para mostrar una variedad de información como el pwd, hostname, user name, etc.
  12. La variable HOME guarda el directorio personal del usuario. Esta variable es útil con scripts.
  13. El comando ps provee una muestra estática del estado de los procesos del sistema.
  14. El comando top provee información en tiempo real de los procesos.
  15. El comando kill es usado para finalizar procesos.
  16. Los procesos pueden ser ejecutado en background usando el simbolo & al final de la sentencia, o usando bg [jobnumber].
  17. Los procesos en foreground pueden ser interrumpidos usando ^Z(CRTL+Z).
  18. Los procesos pueden ser movidos al foreground usando el comando fg [jobnumber]
  19. El comando nice es usado para configurar la prioridad del proceso cuando es iniciado.
  20. El comando renice es usado para cambiar la prioridad de un proceso que actualmente esta siendo ejecutado en el sistema.