MM&S:ProgrammingForMS:Herramientas: Sistemas operativos y colaboración
From hpcwiki
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.
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.
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:
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:
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.
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>
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
Teclee el siguiente código:
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
- Siga las instrucciones para crear una carpeta progMS y configurar el script de bash.
- 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.
- 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.