lunes, 2 de diciembre de 2013

Manejando procesos en segundo plano (UNIX background jobs)

Les paso este mini tutorial para administrar los procesos en segundo plano, nunca sabes cuando lo vas a necesitar :p


1.- ) Ejecutando en segundo plano:
Por ejemplo, cuando ejecutas un comando "du" para obtener la lista de los directorios donde hay backups pesados en mi sistema, esto toma bastante tiempo en ejecutarse, pero tenemos la posibilidad de ejecutarlo en segundo plano directamente en la misma ejecución del comando agregando "&" al final:

#du -h /home | grep backup | grep [0-9]G >> /home/villatux/pesados1Dic2013.txt &

2.- ) Mandando el trabajo actual a segundo plano usando CTRL+Z y el comando bg:
Puedes mandar el trabajo que se está ejecutando a segundo plano con las siguientes instrucciones:
- Presionar "CTRL+Z"  que suspenderá la ejecución del comando
- Ejecutar "bg" para hacer que el comando suspendido continúe pero ahora en segundo plano

Por ejemplo si ya ejecute mi comando y se me olvidó ponerlo en segundo plano podemos hacerlo de la siguiente manera:

#du -h /home | grep backup | grep [0-9]G >> /home/villatux/pesados1Dic2013.txt

#[CTRL+Z]
[2]+  Stopped                 du -h /home | grep backup | grep [0-9]G >> /home/villatux/pesados1Dic2013.txt

#bg

3.- ) Tomar un trabajo del bacground y ponerlo en ejecución normal:
Podemos ver los trabajos en ejecución "background" con el comando "jobs" y con el comando "fg %1" obtiene el trabajo #1 y lo trae a un entorno de ejecución normal:

#jobs
[1]   Running                 bash miscript.sh &
[2]-  Running                 thunderbird &
[3]+  Done                    nautilus .

#fg %1

4.- ) Matar un trabajo especifico usando "kill %"
Si deseas matar un proceso en uso que está en background lo puedes hacer de la siguiente forma:

# kill %2


Espero les sea de utilidad.

miércoles, 27 de noviembre de 2013

Sincronizar subtitulos .srt (script en perl)

Me ha pasado que quiero ver Películas/Series con subtitulos y que no encuentras el subtitulo exacto para tu archivo de vídeo,  pero en cambio encuentras otro subtitulo de la misma serie pero no coinciden los tiempos del video con los subtitulos.

Para solucionar este problema podemos usar un script desarrollado en PERL, que encontré en el blog Matt's Musings con el cual podemos adelantar ó atrasar los tiempos de los subtitulos muy fácilmente.

Ejemplo de uso:
cat The.Bridge.US.S01E05.srt | /home/villatux/sync_subtitles.pl -t +12s > newsubs3.srt

donde  "+12s"  significa que se vá a adelantar 12 segundos,  si quieres atrasar tus subtitulos debes poner el tiempo que desees con signo negativo.

Les paso el código del script: 

#!/usr/bin/perl

use strict;
use Getopt::Long;
my %scales =  ( 'h' => 3600000,
                'm' => 60000,
                's' => 1000,
                'u' => 0,
              );

my ($opt_t);
GetOptions ( "t=s" => \$opt_t, "time"      => \$opt_t,
           );

if ( $opt_t )
{
  my $sign  = substr($opt_t,0,1);
  my $scale = substr($opt_t,length($opt_t)-1, 1);
  my $time  = int(substr($opt_t,1,length($opt_t)-2));

  if ( $sign !~ /[+-]/ || $scale !~ /[hmsu]/ )
  {
    die "Time should be [+-]";
  }

  if ( $scales{$scale} )
  {
    $time = $time * $scales{$scale};
  }

  if ( $sign =~ /-/ )
  {
    $time *= -1;
  }

  while ()
  {
    # 00:01:09,040 --> 00:01:11,713
    if ( /(\d\d):(\d\d):(\d\d),(\d+)\s+-->\s+(\d\d):(\d\d):(\d\d),(\d+)/ )
    {
      my ($sh,$sm,$ss,$su,$eh,$em,$es,$eu) = ($1,$2,$3,$4,$5,$6,$7,$8,$9);

      my $s = ($su + ($ss * $scales{'s'}) + ($sm * $scales{'m'}) + ($sh * $scales{'h'})) + $time;
      my $e = ($eu + ($es * $scales{'s'}) + ($em * $scales{'m'}) + ($eh * $scales{'h'})) + $time;

      my $rt = 0;
      $sh    = int($s/$scales{'h'});
      $rt   += ($sh * $scales{'h'});

      $sm    = int(($s - $rt) / $scales{'m'});
      $rt   += ($sm * $scales{'m'});

      $ss    = int(($s - $rt) / $scales{'s'});
      $rt   += ($ss * $scales{'s'});

      $su    = ($s - $rt);

      $rt    = 0;
      $eh    = int($e/$scales{'h'});
      $rt   += ($eh * $scales{'h'});

      $em    = int(($e - $rt) / $scales{'m'});
      $rt   += ($em * $scales{'m'});

      $es    = int(($e - $rt) / $scales{'s'});
      $rt   += ($es * $scales{'s'});

      $eu    = ($e - $rt);

      printf "%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d\n", $sh,$sm,$ss,$su,$eh,$em,$es,$eu;
    }
    else
    {
      print $_;
    }
  }
}
else
{
  print "You need to specify time offset\n";
}
#FIN DEL SCRIPT


Espero les sirva de algo :p

sábado, 9 de noviembre de 2013

Generar archivos de tamaño especifico en BASH

Me he visto en la necesidad de crear archivos de diferentes tamaños para comprobar el envió de los mismos por correo electrónico y verificar la correcta transferencia en cada peso de archivo.

Para esto hice este pequeño script que al ejecutarlo se le manda como argumento el peso que queremos que tenga nuestro archivo , también como segundo argumento, el nombre del archivo que nos generará en el mismo directorio del script:


#!/bin/bash
#USO:     ./script.sh peso_deseado nombre_del_archivo
#EJEMPLOS: 

#EN Kb ./script.sh 300K archivo300K.txt

#EN Mb ./script.sh 3,0M archivo3Mb.txt
#EN Gb ./script.sh 1,0G archivo1G.txt

while [ 0 ]; do

echo "SJKDFLSJFKLJSKFLSJDKLFJDSKLFJSLKDJFK" >> $2
echo "SJKDFLSJFKLJSKFLSJDKLFJDSKLFJSLKDJFK" >> $2
echo "SJKDFLSJFKLJSKFLSJDKLFJDSKLFJSLKDJFK" >> $2
echo "SJKDFLSJFKLJSKFLSJDKLFJDSKLFJSLKDJFK" >> $2
echo "SJKDFLSJFKLJSKFLSJDKLFJDSKLFJSLKDJFK" >> $2
echo "SJKDFLSJFKLJSKFLSJDKLFJDSKLFJSLKDJFK" >> $2
echo "SJKDFLSJFKLJSKFLSJDKLFJDSKLFJSLKDJFK" >> $2
echo "SJKDFLSJFKLJSKFLSJDKLFJDSKLFJSLKDJFK" >> $2

PESO=$(du -h $2 | cut -f 1)

echo "peso acumulado: $PESO"
if [ $PESO == $1 ]
then
break
fi
done

viernes, 8 de noviembre de 2013

SSH desde Android con vSSH + HackersKeyboard

Recomendación:

Hay ocasiones en que andas ocupado, de viaje, o simplemente no tienes al alcance una computadora y precisamente en ese momento tienes que conectarte a tus servidores por SSH.

Pues para mi era un poco molesto hacer esto desde el celular ya que no podía ejecutar comandos anteriores debido a que el teclado que trae de base Android, no trae la funcionalidad de las tipicas "flechitas". Pero esto cambió cuando preguntando en las redes sociales, y pues ahi Leonel Nuñez me pasó e tip de usar HackersKeyboard para tu cliente ssh en el celular.

En mi caso yo usé la combinación de el cliente vSSH y HackersKeyboard, Lo que desde mi primera impresión fué una experiencia totalmente distinta a las que había tenido sin usar este teclado "Full" .

Les comparto una captura de mi pantalla:



martes, 5 de noviembre de 2013

Comprobar si funcionan mis registros DNS

Cuando trabajas constantemente con registros de dominio, es muy importante comprobar que resuelve adecuadamente el DNS cada que hacemos algún cambio en los archivos de configuración ó hacemos algún nuevo registro en el.



Procedimiento:
Para comprobar la configuración de DNS, en una terminal de sistema, escriba nslookup y, a continuación, presione ENTER.

Escriba server , donde la dirección IP es la dirección IP del servidor DNS externo.

Escriba set q=MX y presione ENTER.

Escriba , donde el nombre de dominio corresponde a un dominio de correo externo, y a continuación presione ENTER.

Debe mostrarse el registro de recurso intercambiador de correo (MX) del dominio especificado. Si no se muestra, DNS no está configurado para resolver nombres de dominio externos.




Ejemplo:
En el ejemplo siguiente se muestra los registros MX para ejemplo.mx y nos muestra sus direcciones que tiene configuradas para el correo electronico:

villatux@vuach:~/Escritorio$ nslookup
> 148.227.5.13
Server: 127.0.1.1
Address: 127.0.1.1#53

13.5.227.148.in-addr.arpa name = dns.ejemplo.mx.
> set q=MX
> ejemplo.mx
Server: 127.0.1.1
Address: 127.0.1.1#53

ejemplo.mx mail exchanger = 0 salida.ejemplo.mx.
ejemplo.mx mail exchanger = 0 salida2.ejemplo.mx.



Comprobar si resuelve un registro. En este caso vamos a ver si nuestro DNS resuelve un nuevo registro "facturas" , y lo podemos hacer de esta manera:

villatux@vuach:~/Escritorio$ nslookup facturas.ejemplo.mx 148.227.5.13
Server: 148.227.5.13
Address: 148.227.5.13#53

facturas.uach.mx canonical name = facturas.ejemplo.mx.
Name: facturas.ejemplo.mx
Address: 148.227.5.170