Personal tools

MM&S:ProgrammingForMS:Herramientas: Sistemas operativos y colaboración

From hpcwiki

Jump to: navigation, search

Regresar a MMS: Computer programming for M&S


Contents

Sistemas operativos tipo Unix: Unix, Linux y OS X

El sistema operativo es el puente entre los programas y aplicaciones y el hardware de la máquina. Existen diferentes tipos de Sistemas Operativos: En los computadores de escritorio: Linux, en infinidad de versiones; Windows; OS X (sólo para Apple). De hecho Linux y OS X se denominan "unix-like", por que siguen una filosofía de diseño que fue iniciada en los laboratorios AT&T para el desarrollo de UNIX. En la práctica esto hace muy sencillo para el usuario utilizar estos entornos, ya que la forma de trabajar (interface) de muchas aplicaciones es similr entre ellos.

El presente curso se basa en Ubuntu 13.04.

Estructura del sistema de Archivos en Ubuntu

El sistema de archivos de Linux organiza en un árbol tanto el sistema operativo, los archivos de los usuarios, y los discos externos (usb, CD, DVD) que estén en uso.

Linux-filesystem.png

El nivel más bajo se es /.

En Linux, como en las versiones modernas de Windows, los archivos tienen diferentes permisos: lectura, el que los contenidos del archivo puedan ser vistos; escritura, el que puedan ser modificados; y ejecución, que los contenidos puedan ser usados como un programa y "ejecutarse".

Una máquina de linux puede tener diferentes usuarios, que a su vez se pueden organizar en grupos.

Shells

Una de las maneras de interactuar con el sistema operativo es la interfaz gráfica, (siglas en inglés GUI); que requiere un mouse o pantalla tactil.

Los "shells" son programas que permiten interactuar con el sistema operativo del computador tecleando comandos, también llamados interfaces de línea de comandos (siglas en inglés CLI). El shell interpreta el comando escrito en el teclado y usualmente imprime en la pantalla información relevante para el usuario.

TERMINAL DASH.png

Bajo Linux, OS X y Unix, para comenzar a usar el shell se encuentra en un programa llamado la "ventana de terminal", que permite interactuar con el computador. En Unity se puede abrir haciendo click en el boton Dash, y tecleando terminal. (Dash es el ícono con forma circular que usualmente se encuentra en la esquina superior izquierda de la pantalla, vea aquí las partes de la interfaz de ubuntu: Bajo OS X se puede abrir una terminal siguiendo este camino: Aplicaciones --> Untilidades --> Terminal.

Windows también trae una interfaz de línea de comandos, que históricamente está ligada a otro sistema operativo: DOS. Tenga en cuenta, DOS no es UNIX; en ésta clase no usaremos DOS.

Históricamente las interfaces de línea de comandos son anteriores a las interfaces graficas, pero no necesariamente son menos poderosas. Muchos programas avanzados como MATLAB o AUTOCAD usan una línea de comandos para facilitar la escritura de comandos complicados; para los que llevaría mucho más tiempo introducirlos mediante un sistema de ventanas.

Shells de Unix

Vea también: Software Carpentry: "The Shell" [1]

Abrir una terminal genera un prompt, unos caracteres que indican alguna información del sistema y el que el sistema está listo para recibir comandos:

TERMINAL PROPT.png

En este caso tenemos el nombre del usuario: mms-usuario y el nombre de la máquina: @mms-usuario-VirtualBox , seguidos de dos puntos. Existen diferentes tipos de shell. En esta clase usuaremos el shell por defecto, llamado BASH.

Para el resto de ésta guía nos referiremos al prompt como $, por economía de espacio, aunque en su computador salga algo más complejo.

pwd, cd, ls

Al escribir un comando, en general, se obtiene una respuesta seguida seguida del prompt. Un ejemplo es el comando pwd

   $ pwd
   /home/mms-usuario/
   $

En UNIX pwd significa imprima el directorio actual (del inglés print working directory). Los directorios también se llaman carpetas. El path representa el camino que habría que recorrer desde el directorio raíz para llegar a la carpeta actual. En este caso se muestra una carpeta home, que contiene los archivos personales de todos los usuarios de éste computador; estamos en la subcarpeta mms-usuario.

Para mostrar los archivos que están en éste directorio se usa el comando ls (de lista).

   $ ls

ls tiene diferentes opciones, las cuales se obtienen escribiendo un signo menos. -l muestra los contenidos en una lista, enumerando algunas de sus características; -t organiza los resultados por el momento en que fueron modificados; -r organiza la lista al revés; -a muestra todos los archivos, incluyendo los ocultosq . Se pueden agrupar diferentes opciones en una sola:

   $ ls -rtla

En este caso los primeros símbolos representan los permisos que tiene el archivo para ser leido, modificado y ejecutado tanto por el usuario como por el grupo, vea: [2].

Los comandos también pueden tomar argumentos. En ese caso los argumentos pueden ir después del comando o después de una opción. Por ejemplo, para ls se puede decir que únicamente se muestre la información de un archivo específico. En este caso se usa:

   $ ls -l fname

Existen diferentes comodines. El símbolo * significa "cualquier secuencia de caracteres". Por ejemplo: si usted quiere que le muestren todos los archivos que comienzan por una letra A mayúscula, se teclea:

   $ ls A*

Los archivos pueden tener extensiones, que están después de un punto. Para mostrar todos los archivos terminados en .txt:

   $ ls *.txt

Otro comodín es el símbolo de interrogación, que significa que en esa posición puede ir cualquier caracter. Por ejemplo, todas las variaciones de una letra del nombre Andrés (Andrés, Andrea, Andrew, Andres, etc) :

   $ ls Andr??

La lista de opciones del comando ls es muy amplia. Otro comando de BASH es man, que invoca manuales de programas. Para leer el manual de ls, teclee:

   $ man ls

En éste caso ls no es un comando si no un parámetro para man.

Para cambiar de directorio en una terminal se usa el comando cd (acrónimo del inglés change directory). cd acepta como argumento un camino (path) absoluto a la raiz o relativo al punto del sistema de archivos donde usted está. Por ejemplo, el directorio /usr/share/doc contiene documentación sobre los programas que usted ha instalado. Para llegar allí, desde cualquier lugar, se puede teclear:

   $ cd /

(para ir al directorio raiz)

   $ cd usr
   $ cd share
   $ cd doc

Para comprobar:

   $ pwd
   /usr/share/doc

Alternativamente se podría haber usado el comando:

   $ cd /usr/share/doc

La carpeta, directorio, donde están ubicados todos los archivos del usuario se llama home. Para el ejemplo de la máquina virtual del curso, está localizada en /home/mms-usuario , porque el nombre del usuario por defecto de esta máquina es mms-usuario. Para ir a su home se puede telcear el comando cd sin argumentos:

   $ cd 

O, alternativamente, teclear:

   $ cd ~

También se puede acceder a directorios relativos al home, por ejemplo:

   $ cd ~/Documents

Cambia a la carpeta Documents, dentro del home del usuario.

Otro argumento útil para cd es el signo menos, que sirve para ir al directorio anterior. Por ejemplo, si se teclea:

   $ cd ~/Documents
   $ cd /usr/share/doc/vlc
   $ pwd

(ahora está en el directorio de documentos de vlc)

   $ cd -
   /home/mms-usuario/Documents
   $

(ahora está en el directorio ~/Documents)

pipe ">"

La salida de los comandos se puede entender como un flujo de datos. Los pipes permiten controlar esos datos. Un programa de terminal tiene dos salidas por defecto, STDOUT y STDERR; la primera tiene la salida estandar y la segunda la salida producida por errores de ejecución del programa. Para direccionar STDOUT se usa el símbolo >. Por ejemplo:n

   $ ls > contenidos.txt
   $

Corre el comando ls, pero su salida (es decir, la lista de los contenidos de este directorio) la reenvía a otro archivo, que se llama contenidos.txt

cat

El comando cat pega uno o varios archivos, y envía su resultado a pantalla. Por ejemplo, si creara ahora un archivo con:


   $ ls -l > lista.txt
   $

Es posible pegar los dos archivos usando cat:

   $ cat lista.txt contenidos.txt

En este caso los contenidos de los archivos se muestran consecutivamente en la pantalla, ya que esa es la salida estandar de cat. Para realmente pegar los archivos se usa de nuevo el símbolo >:

   $ cat lista.txt contenidos.txt > archivosunidos.txt

pipe "2>"

El comando 2> hace referencia a la salida estándar de error. Por ejemplo si yo intentara pedir la lista de los contenidos del directorio /root, que contiene los archivos de la cuenta del administrador de la máquina, el sistema me reportaría un error:

   $ ls /root
   ls: cannot open directory /root: Permission denied
   $

También se puede enviar esta salida a un archivo, usando el comando 2>:

   $ ls /root 2> salidaerrror.txt
   $

grep

El comando grep filtra la salida, mostrando únicamente lo que tenga ciertos caracteres.

pipe "|"

La barra vertical es un tubo (pipe) que manda la salida estandar de un programa hacia la entrada estandar de otro. Por ejemplo:

Grep pipe.png

head, tail

Para ver las primeras 10 líneas de un archivo, o las 5 últimas:

   $ head -10 filename
   $ tail -5 filename

borrar, mover, copiar archivos

Para borrar un archivo se usa el comando rm

   $ rm filename
   $

Los directorios no pueden

Para mover un archivo:

   $ mv archivo path_nuevo_directorio/

También se puede renombrar:

   $ mv archivo nuevoNombre

Para copiar un archivo:

   $ cp oldfile newfile

El archivo original todavía existe. Para copiar un directorio se usa la bandera "-r" de recursivo:

   $ cp -r olddir newdir

Trabajos en el fondo o en el frente

Para correr un programa que lleve mucho tiempo de ejecución es posible usarlo en el fondo (background), de tal forma que la terminal no quede bloqueada. Por ejemplo, corra el programa xeyes, que simplemente produce un par de ojos.

   $ xeyes 

La terminal queda inutilizada hasta que se cancele el comando (CONTROL C) o se cierre la ventana. En contraste si se corre como:

   $ xeyes &

El comando sigue corriendo en el fondo.

Si un programa se ha corrido en el frente se puede volver al fondo usando primero CONTROL Z, para suspender el comando, seguido por bg

   $ emacs
   ^Z
   $ bg
   $

Para averiguar que procesos están corriendo en el fondo se usa el comando:

   $ jobs -l
   [1]-  2378 Running                 xeyes &
   [2]+  2379 Running                 emacs 2> /dev/null &

El número [1] y [2] se usa para devolver el programa al frente, usando por ejemplo:

   $ fg %1

Para devolver al frente al programa xeyes. Los números 2378 y 2379 son los identificadores de proceso, pid.

nice, top, ps

Para dar una prioridad baja a un comando, de tal forma que otros comandos más urgentes puedan correr, se usa el comando nice:

   $ nice -n 19 ./fortrancode.exe &

Para saber cuales son los comandos que están usando más CPU se usa el comando top. Este comando se termina con la letra q.

top no alcanza a mostrar en la pantalla todos los procesos (programas) que están corriendo. Para mostrar una lista con todos ellos se usa el comando:

   $ ps aux

Dado que esto produce una lista muy larga, se suele enviar la salida de este comando, mediante un pipe, hacia grep. Por ejemplo si usted quiere buscar todos los procesos que corren xeyes:

   $ ps aux | grep xeyes
   gavox    30445  0.2  0.0  45564  2208 pts/28   S    17:04   0:00 xeyes
   gavox    30447  0.0  0.0  13648   972 pts/28   S+   17:04   0:00 grep --color=auto xeyes

En este caso el primer número corresponde al PID (process ID) de cada proceso. En este ejemplo hay dos líneas, la primera corresponde a xyes mismo, la segunda al comando ps aux | grep xeyes.

terminar programas: kill

Para terminar un trabajo que está corriendo en el frente, se usa la combinación de teclas CONTROL C. Ahora, si el trabajo está corriendo en el fondo se puede terminar usando el comando kill. En el ejemplo que se uso atrás, por ejemplo se pueden matar los ojos usando:

   $ kill -9 2378

sudo

Algunos comandos no pueden ser corridos por los usuarios, únicamente por el superusuario, o administrador. Una forma de saltar esta restricción es usar el comando sudo:

   $ sudo rm 70-persistent-net.rules

Borra un archivo que no puede borrar un usuario.

Sandwich.png

Bash y su configuración

Existen muchos shells para Unix. Personalmente a los profesores de esta clase les gusta BASH. Algunas cosas se pueden cambiar de la configuración de BASH, usando un archivo oculto en su directorio local.

Primero, miremos los contenidos del archivo de inicialización de bash .bashrc:

   $cat .bashrc

Esto debe imprimir a pantalla una serie de comandos de Bash. Bash usa una serie de variables, llamadas variables de ambiente. Por ejemplo, cual es el nombre del usuario, cual es su directorio home, en que rama del arbol de directorios (path) está actualmente, etc. Para imprimirlas todas se usa el comando printenv.

   $ printenv

(produce una salida larguísima)

   $ printenv | grep USER
   USER=/mms-usuario

Como ejemplo, vamos a crear una variable de BASH que sea el directorio donde usted trabajará los contenidos de esta clase. Primero crearemos el directorio. De la siguiente forma:

   $ cd 
   $ mkdir progMS

Esto crea un directorio en su disco duro, que se encuentra alojado en el siguiente path:

   /home/mms-usuario/progMS

Para añadir una variable de BASH que apunte a este directorio se puede editar el archivo .bashrc. Una opción es usar gedit:

   $ cd
   $ gedit .bashrc &

Después de eso mueva el cursor hasta la última línea (114) y añada un par de espacios. En este archivo los comentarios (no se ejecutan) se señalan por un símbolo de número. Escriba allí:

   # Variable de ambiente para contenidos del curso Programación para Modelado y Simulación:
   export PROGMMS=~/progMS

Cierre la terminal y vuélvala a abrir. Ahora PROGMMS es una nueva variable de ambiente, que apunta al directorio progMS:

   $ cd
   $ cd PROGMMS
   $ pwd
   /home/mms-usuario/progMS

Ésta variable de ambiente está en la lista de variables de BASH, que se obtiene con el comando printenv:

   $ printenv | grep prog
   PROGMMS=/home/mms-usuario/progMS
   PWD=/home/mms-usuario/progMS

touch

touch es una herramienta para crear archivos que no contengan nada, o cambiar la fecha de un archivo a la más reciente. Por ejemplo:

   $ cd $PROGMMS
   $ touch HelloWorld.cpp

crea un archivo vacío que se llama HelloWorld.cpp

   $ ls -la
   -rw-rw-r-- 1 mms-usuario mms-usuario 0 ago 1 09:39 HelloWorld.cpp

Indica que hay un archivo, llamado HelloWorld.cpp, que tiene permisos de lectura y escritura para su dueño y el grupo al que pertenece, cuyo dueño es el mms-usuario, que tiene un tamaño de 0 bytes, y que fue creado el primero de agosto a las 9:39.

Shell de Octave

En la máquina virtual de este curso se incluye octave y un entorno gráfico conocido como QtOctave. Octave se puede invocar mediante un comando de terminal, escribiendo:

   $octave
   octave:1>

TERMINAL OCTAVE.png

IPython shell

Existe un shell para Python muy poderoso, llamado iPython . El prompt de IPython es distinto al de python. Para correr IPython se usa el comando IPython en la terminal. IPython también es el shell por defecto en algunos entornos gráficos, como Canopy.

   $ ipython
   Python 2.7.2 (default, Jun 20 2012, 16:23:33) 
   Type "copyright", "credits" or "license" for more information.
   IPython 0.14.dev -- An enhanced Interactive Python.
   ?         -> Introduction and overview of IPython's features.
   %quickref -> Quick reference.
   help      -> Python's own help system.
   object?   -> Details about 'object', use 'object??' for extra details.
   In [1]: x = 4./3.
   In [2]: x
   Out[2]: 1.3333333333333333
   In [3]: 

El prompt dice In[n], donde n es un número que avanza secuencialmente. Las salidas se obtienen con Out[n]. IPython guarda las salidas con una referencia en caracteres, de tal forma que se pueden usar las salidas anteriores. Por ejemplo, para multiplicar la primera entrada por 4 se puede usar:

   In [3]: _2 * 3
   Out[3]: 4.0

En este caso decimos que la salida Out[2] debe ser multiplicada por 3.

El shell de IPython reconoce comandos de UNIX, como pwd,ls, etc.

   In [4]: pwd


Editores de texto : Gedit

El editor por defecto para Ubuntu es gedit. Será lanzado por defecto al abrir un archivo de texto. Una opción para editar este archivo es usar gedit:

   $ gedit HelloWorld.cpp 

GEDIT EMPTY.png

Teclee el siguiente código:

HolaMundoCPP.png

gedit creará el archivo HelloWorld.cpp. Al saber que usted quiere hacer un programa de C++, gedit usa una combinación de colores que permite diferenciar las diferentes estructuras de programación, en este caso las palabras reservadas, los tipos de variable, etc.

Cuando NO usar el shell, nautilus

También es posible navegar los contenidos del árbol de directorios usando el programa nautilus. Su ícono es un archivador. Lo más util puede ser usar una combinación de ambos métodos. Por ejemplo, para ir rápidamente a la carpeta /usr/share/doc lo más sencillo es abrir una terminal y teclear:

   $ cd /usr/share/doc

Una vez allí tal vez sea mejor tener una ventana que muestre los contenidos. Esto se puede hacer llamando a nautilus:

   $ nautilus . 

Tarea

  1. Siga las instrucciones para crear una carpeta progMS y configurar el script de bash.
  2. El comando xeyes crea una ventana que contiene unos "ojos" que siguen el cursor. Abra una terminal y lance 5 veces el comando ojos. A continuación use el comando ps aux para averiguar cuales son los PID de estos procesos y termínelos.
  3. Desde la terminal: en su carpeta progMS, cree una carpeta que se llame "tareas de bash". Usando touch, cree 5 en esa carpeta 5 archivos vacios, llamados "vacio1.txt", ..., "vacio5.txt". Usando la salida estandar (el sìmbolo mayor que) cree un archivo donde estén los contenidos de éste directorio al usar "ls", llamado "listaSIMPLE.txt". Cree otro donde estén los contenidos de éste directorio incluyendo los permisos de escritura, llamado "listaPERMISOS.txt". Usando cat, pegue los contenidos de estos dos archivos en uno que se llame "pegados.txt".


Further reading

  • La página linux command dot org, hace una introducción similar: [3]
  • Touring the Ubuntu Unity Desktop [4]
  • Sistema de archivos de Linux: [5]
  • "Using Ubuntu on the Desktop" [6]
  • Tabla de comandos de teclado de BASH : [7]

Licencia

El contenido de ésta página ha sido adaptado de: [8]. Se distribuyen mediante la licencia CC BY, disponible en [9]. En líneas generales usted puede usarlas y modificarlas, mientras que mencione a sus autores. El comic proviene de [xkcd.com], "Un webcomic de romance, sarcasmo, matemáticas y lenguaje", y se distribuye mediante la licencia [10], similar a la anterior, pero en este caso no se puede modificar su contenido para fines comerciales.