Archivo de la etiqueta: Linux

Herramientas

Crear un bash alias que reciba parámetros

Por ejemplo si queremos tener un alias que nos permita importar la db de un proyecto:

En el archivo .bash_aliases o .bashrc de tu home:

# 1: creamos una función:
importar_db_demo() {
    mysql -uusuario_demo -p labasededatosdedestino < $1
}
# 2: Declaramos el alias
alias importar_db=importar_db_demo

Listo. ya podemos usarlo en la consola:

importar_db mydb.sql

Por ultimo aclarar que podes pasar la cantidad de parámetros que quieras. estos parámetros llegan a la función por medio de $1 para el primero $2 para el segundo, etc.

Featured sites

    tux

    Emparejar dispositivos a2dp (audio por bluetooth) en Debian 7

    Espero que esto le ahorre todo el tiempo que yo he perdido :D

    Síntoma: Emparejas un dispositivo de audio vía bluetooth y parece que ha conectado, pero al cabo de un segundo se desconecta.

    Solución:

    sudo apt-get install pulseaudio pulseaudio-module-bluetooth bluez-audio pavucontrol bluez-firmware bluez-tools && sudo service bluetooth restart && sudo killall pulseaudio
    

    Y ya podes emparejar sin problemas.

    Chau!

    tux

    Instalar Skype en Debian 7

    Problema: Skype tiene un paquete .deb multiarquitectura… pero en Debian solo podés instalarlo en 32 bits.

    Solución:

    sudo dpkg --add-architecture i386 && sudo apt-get update
    

    Ya podés instalar el .deb sin problemas.

    Chau!

    Drupal APC: configuración rápida

    Aquí dejo una configuración rápida de APC.

    extension=apc.so
    apc.shm_segments=1
    apc.shm_size=256M
    

    Si están usando Debian o derivados pueden poner la configuración en /etc/php5/conf.d/20-apc.ini (la parte del nombre “20-” puede variar, verifiquenlo antes de editar).

    Para mas opciones ver http://www.php.net/manual/es/apc.configuration.php

    No olvides reiniciar apache: sudo service apache2 restart

    Chau!

    Node.js

    Desplegar una aplicación Node.js como servicio Upstart (demonio)

    Cuando quise desplegar mi app, imagine que iba a ser fácil, que lanzaba el comando “node miapp.js” y punto, pero aprendí a palos que así no va la cosa.

    Para desplegar una aplicación web, necesitas que funcione como apache por lo menos: que puedas arrancarla, pararla, reiniciarla, ver su estado, acceder a su log, que se reinicie si se produce un error, etc etc etc.

    Busque por Internet y leí un montón de artículos y foros que te dicen como montartelo: haciendo scripts en /etc/init.d y combinándolo con monit para reiniciarlo si se cae, Usando Upstart, lanzando la aplicación con “node miapp.js &” (proceso en background pero es la peor solución que leí en años), y alguna que otra mas.

    La mas razonable fue la de Upstart, aunque ninguna de las soluciones fue bastante clara o completa como para copiar, pegar y arrancar. Por eso hice este script que toma en cuenta todo lo que hace falta para montar tu app como un servicio:

    description "Demonio para mi aplicación en Node.js"
    author "Capy - http://ecapy.com"
    env LOG_FILE=/var/log/node/miapp.log
    env APP_DIR=/var/node/miapp
    env APP=app.js
    env PID_NAME=miapp.pid
    env USER=www-data
    env GROUP=www-data
    env POST_START_MESSAGE_TO_LOG="miapp ha sido iniciada."
    env NODE_BIN=/usr/local/bin/node
    env PID_PATH=/var/opt/node/run
    env SERVER_ENV="production"
    ######################################################
    # A partir de aquí no debería hacer falta tocar nada #
    ######################################################
    #Nuestro proceso espera hasta que el sistema este cargado
    start on runlevel [2345]
    #Y se detiene cuando el sistema se apague
    stop on runlevel [016]
    #Levanta el proceso automáticamente si se muere:
    respawn
    #limitamos el "respawn" a 99 veces con un timeout de 5s para que no intente levantar el proceso infinitamente.
    respawn limit 99 5
    pre-start script
        #Necesitamos asegurarnos que el path del pid exista antes de arrancar el proceso.
        mkdir -p $PID_PATH
        mkdir -p /var/log/node
    end script
    script
    	#Seteamos NODE_ENV para que nuestra app se ejecute en modo production, development, test, etc.
    	export NODE_ENV=$SERVER_ENV
    	#El siguiente comando es el que realmente arranca el proceso:
    	#Utiliza el usuario y grupo www-data (--chuid)
    	#Asigna un pid y lo crea si no existe (--make-pidfile y --pidfile)
    	#Cambia el directorio de ejecución a donde esté nuestra app de node (--chdir)
    	#Ejecuta la app (--exec)
    	#Envía cualquier output que genere nuestra app al log (>> $LOG_FILE 2>&1)
        exec start-stop-daemon --start --chuid $USER:$GROUP --make-pidfile --pidfile $PID_PATH/$PID_NAME --chdir $APP_DIR --exec $NODE_BIN -- $APP >> $LOG_FILE 2>&1
    end script
    post-start script
    	echo $POST_START_MESSAGE_TO_LOG >> $LOG_FILE
    end script
    

    Puede parecer un poco largo, pero si lo lees detenidamente vas a ver que es bastante concreto:

    1. Autor y descripción: son parte básica de un script Upstart
    2. Variables de configuración para que no tengas que meterte entre el código para ajustar el script para cada nueva app que crees.
    3. Cuerpo del script.

    Acá esta el mismo script sin comentarios:

    description "Demonio para mi aplicación en Node.js"
    author "Capy - http://ecapy.com"
    env LOG_FILE=/var/log/node/miapp.log
    env APP_DIR=/var/node/miapp
    env APP=app.js
    env PID_NAME=miapp.pid
    env USER=www-data
    env GROUP=www-data
    env POST_START_MESSAGE_TO_LOG="miapp ha sido iniciada."
    env NODE_BIN=/usr/local/bin/node
    env PID_PATH=/var/opt/node/run
    env SERVER_ENV="production"
    ######################################################
    start on runlevel [2345]
    stop on runlevel [016]
    respawn
    respawn limit 99 5
    pre-start script
        mkdir -p $PID_PATH
        mkdir -p /var/log/node
    end script
    script
        export NODE_ENV=$SERVER_ENV
        exec start-stop-daemon --start --chuid $USER:$GROUP --make-pidfile --pidfile $PID_PATH/$PID_NAME --chdir $APP_DIR --exec $NODE_BIN -- $APP >> $LOG_FILE 2>&1
    end script
    post-start script
    	echo $POST_START_MESSAGE_TO_LOG >> $LOG_FILE
    end script
    

    Uso:

    Por cada aplicación en nodejs que quieras montar tenes que crear un archivo en /etc/init/. El nombre del archivo tiene que terminar en .conf. por ejemplo miapp-service.conf. Una cosa importante es que el servicio que estas creando se llama como el archivo (sin el .conf), por lo que en nuestro ejemplo se va a llamar miapp-service.

    Dentro de /etc/init/miapp-service.conf pegas el script y personalizas todo lo que haya hasta la linea divisoria.

    Un par de aclaraciones:
    env APP=app.js define el nombre del “index” de tu aplicación, y por lo general se usan o app.js o server.js. Pon el nombre de tu app sin el path hasta ella. Si tu aplicación lleva parámetros podes encerrar en comillas dobles algo asi como “env APP=app.js -extrasettings ../settrings.json”
    env APP_DIR=/var/node/miapp el path hasta tu aplicación
    env PID_NAME=miapp.pid pon el nombre que quieras, pero que sea único. por ejemplo, si tu app es una pagina web pon el nombre de tu pagina “mipaginaweb_com.pid” o algo así.
    env USER=www-data y env GROUP=www-data no sería muy responsable usar root para ejecutar tu aplicación salvo que esta si que necesite estar en root, pero en el caso de que sea una pagina web, usa el usuario y grupo www-data así podes unificar criterios. Es solo una sugerencia, yo para mi app uso www-data aunque podes usar el grupo y usuario que te parezca mejor.
    POST_START_MESSAGE_TO_LOG es solo un mensaje que se envía al log de la app cuando esta arranca.
    NODE_BIN indica donde esta ubicado node, por lo general está en /usr/local/bin/node aunque si no estuviera allí podes cambiar este parámetro.
    env SERVER_ENV=”production” Posiblemente tu aplicación web utilice entornos de “development“, “test” y “production“. Bien, especificalo acá.

    El resto del script está comentado en código así que no añado nada.

    Cuando hayas acabado ya vas a disponer de tu servicio y tratarlo como cualquier otro:

    start miapp-service
    stop miapp-service
    restart miapp-service
    status miapp-service
    

    Espero que les sirva.

    Chau!

    1263055237_start-here-ubuntuoriginal

    Añadir tu usuario de linux al grupo www-data

    Cuando instalo un LAMP en algún Linux suelo añadir mi usuario (capy) al grupo www-data, cambio el directorio www al grupo www-data y le doy permisos de escritura a los usuarios del grupo para garantizarme que no vaya a tener problemas de permisos y cosas raras:

    sudo usermod -a -G www-data capy
    sudo chown www-data. /var/www/ -R
    sudo chmod g+rw /var/www -R
    

    Y si no te da bola reinicia y se soluciona.

    Chau!

    Node.js

    Hacer proxy con Apache para aplicaciones node.js

    Tenemos una app desarrollada en nodejs que corre en el puerto 4000 de nuestro servidor y queremos exponerla por el puerto 80 para que la gente pueda usarla. El problema obvio es que por lo general tenemos corriendo un apache, nginx o cualquier otro servidor http.

    La solución es usar los módulos de proxy que incluyen cada uno de estos servidores web. Hoy puntualmente lo vamos a hacer con Apache.

    Habilitamos los modulos proxy y proxy_http para permitir el reenvío de peticiones HTTP y HTTPS:

    sudo a2enmod proxy
    sudo a2enmod proxy_http
    

    Luego nos queda crear un vhost:

    sudo nano /etc/apache2/sites-available/mipaginaweb.com
    

    Y ponerle lo siguiente:

    <virtualhost *:80>
        ServerName mipaginaweb.com
        ServerAlias www.mipaginaweb.com
        ProxyRequests off
        <proxy *>
            Order deny,allow
            Allow from all
        </proxy>
        <location "/">
            ProxyPass http://localhost:4000/ retry=0
            ProxyPassReverse http://localhost:4000/
        </location>
    </virtualhost>
    

    Habilitamos nuestro nuevo vhost:

    sudo a2ensite mipaginaweb.com
    

    Hemos terminado. reiniciamos apache y a correr!

    sudo service apache2 restart
    

    Bonus: si estas en un entorno de desarrollo y quieres acceder a mipaginaweb.com, edita tu archivo hosts (sudo nano /etc/hosts) y añade tu nuevo dominio:

    127.0.0.1 localhost
    127.0.0.1 mipaginaweb.com www.mipaginaweb.com
    
    Druplicon

    Instalar y configurar xhprof para que funcione en Drupal.

    El modulo Devel nos proporciona una buena forma de integrar xhprof en nuestra instalación de drupal, y vamos a aprovecharla.

    Xhprof para quien no lo conozca aun, es un profiler. Principalmente nos permite saber de forma detallada cuanta ram, cpu y tiempo han consumido cada una de las funciones que se utilizan en un request.
    De esta forma podemos centrarnos en las funciones mas conflictivas y resolver sus cuellos de botella.

    Si se van a la configuración de Devel podemos ver que la opción esta deshabilitada

    Y es solo porque no tenemos xhprof  instalado, asi que manos a la obra:

    NOTA: Los pasos de instalación los hice en D7 sobre Ubuntu, pero son compatibles con cualquier *nix siempre que se adapten las rutas de las carpetas a las que utilicé el SO sobre el que quieras instalarlo.

    Primero instalemos xhprof desde su código fuente. con la consola en mano te vas a tu home (por decir algún lado) y lanzamos:

    wget http://pecl.php.net/get/xhprof-0.9.2.tgz
    tar xvf xhprof-0.9.2.tgz
    cd ./xhprof-0.9.2/extension/
    phpize
    ./configure --with-php-config=/usr/bin/php-config
    make
    make install
    

    Configuremos PHP para que use xhprof:

    nano /etc/php5/conf.d/xhprof.ini
    

    Y pegar esto dentro:

    extension=xhprof.so
    xhprof.output_dir="/var/tmp/xhprof"
    

    Listo, ya tenemos instalado xhprof.
    Ahora creemos el directorio en el que se van a generar los dump (cada request genera un archivo de dump con toda la informacion registrada):

    mkdir -p /var/tmp/xhprof
    chown www-data. /var/tmp/xhprof
    

    Bien, ahora dentro de la carpeta que contiene el codigo fuente que usamos hace un momento para hacer la instalacion, tenemos que copiar las carpetas “xhprof_html” y “xhprof_lib” en “/usr/share/php/“:

    cp -Pr xhprof_html/* /usr/share/php/xhprof_html/
    cp -Pr xhprof_lib/* /usr/share/php/xhprof_lib/
    

    Xhprof genera graficos que son de mucha ayuda a la hora de identificar cuellos de botella y para crearlos utiliza las capacidades del programa graphviz. si no lo tenés instalado poder hacerlo lanzando:

    apt-get install graphviz
    

    Ok terminamos con la configuracion de xhprof. configuremos el resto del entorno para que pueda hacer uso de el.
    Lo siguiente es crear un vhost para poder acceder a la informacion que genere xhprof:

    nano /etc/apache2/sites-available/xhprof
    

    Y pegas esto:

    <virtualhost localhost:9999>
       DocumentRoot /usr/share/php/xhprof_html
       DirectoryIndex index.php
       <directory /usr/share/php/xhprof_html>
         AllowOverRide all
         Options FollowSymLinks
       </directory>
    </virtualhost>
    

    Nuestro vhost corre en el puerto 9999 asi que tenemos que agregarlo a apache:

    nano /etc/apache2/ports.conf
    

    debajo de “Listen 80” agrega:

    Listen 9999
    

    Estamos por teninar. Habilita el vhost que hemos creado con el comando “a2ensite xhprof“, reinicia apache con “service apache2 restart” y en nuestra instalación de Drupal 7 vayamos a “admin/config/development/devel” para configurarlo:

    Ahora ves que ya podes marcar la opcion “Enable profiling of all page views and drush requests.


    Cuando la marques vas a tener que rellenar:
    xhprof directory:” ponele “/usr/share/php” (sin comillas)
    XHProf URL:” ponele “http://localhost:9999” (sin comillas)

    Y listo. ya lo tenes integrado en drupal. si miras en la parte inferior izquierda de cualquier pagina de la instalacion de tu drupal vas a ver que aparece un link llamado “XHProf output que te va a llevar a la pagina informativa del perfilado que se hiso.

     

     

    Bonus!:

    Nota: solo por cuestiones de mantenimiento te comento que los dump que genera xhprof en la carpeta “/var/tmp/xhprof” tienden a comerse el disco en cuestion de dias. la solucion que uso es lanzar un cron que limpia todos los dump que tengan mas de un dia.

    El cron es un archivo con permisos de ejecucion y el siguiente contenido

    #!/bin/bash
    #Elimina todos los perfilados que tengan mas de 1 día
    find /var/tmp/xhprof -type f -mtime +1 -exec rm -f {} \;
    

    Guardalo en /etc/cron.daily/xhprof_cleaner.sh y listo.

    Una nota final. La configuracion que explique no tiene en cuenta la seguridad. esto quiere decir que no deberias utilizarla en produccion salvo que sepas lo que haces.

    tux

    Habilitar .bashrc al iniciar sesión

    Problema: querés usar .bashrc para poner un alias por ejemplo, pero .bashrc no existe.

    Solución: te vas a la home de tu usuario y tipeas lo siguiente:

    cd ~
    nano .bashrc

    Y dentro del archivo pongamos un alias por ejemplo:

    alias ll='ls -l'

    Guardamos los cambios y pasamos a lo siguiete que es:

    nano .bash_profile

    Pegamos esta condición para que .bashrc se cargue al iniciar sesión.

    if [ -f ~/.bashrc ]; then
    . ~/.bashrc
    fi

    All done, ya podes reiniciar la sesión que vas a ver que el alias “ll” funciona sin problemas. ;)