Cuando Apache no inicia porque Skype se ejecuta primero

Cuando en la misma computadora conviven Skype y Apache podemos llegar a tener inconvenientes porque ambos utilizan el puerto 80 para sus conexiones. El puerto 80 es el puerto en el que por defecto Apache escucha las conexiones mientras que Skype lo utiliza como un puerto adicional o de respaldo. Contemplar que no sea un error de configuración de Apache el que no permite iniciarlo!

El problema se produce si:

  • Apache está configurado para escuchar en el puerto 80
  • Skype se inicia antes que Apache, por lo que se le asigna el puerto
  • Apache no puede iniciar

Cuando intentamos iniciar Apache desde la línea de comandos de Windows veremos el siguiente error:

net start apache2.2
El servicio de Apache2.2 está iniciándose.
El servicio de Apache2.2 no ha podido iniciarse.
Error específico del servicio: 1.
Puede obtener más ayuda con el comando NET HELPMSG 3547.

Para solucionarlo tenemos 3 alternativas:

1. Cambiar configuración de Skype

Dado que Skype utiliza el puerto 80 como un adicional, esta es la solución recomendada por mí. Para ello:

  1. Iniciar sesión en Skype
  2. Acceder al menú Herramientas > Opciones
    • o bien, presionar Ctrl + ,
  3. Abrir la opción Avanzada > Conexión
  4. Desmarcar la opción “Usar los puertos 80 y 443 para conexiones entrantes adicionales”
  5. Confirmar con Guardar

Si vemos que Skype permite las comunicaciones correctamente, y podemos iniciar el servicio de Apache, entonces damos por solucionado el problema.

Es posible que en ciertos entornos no sea una solución aplicable por políticas de seguridad de la red interna que no permitan conexiones en el puerto configurado de Skype, pero sí en alguno de los adicionales (80 o 443).

2. Cambiar el puerto de Apache

Si es posible utilizar un puerto alternativo para Apache, y nuestra aplicación web lo soporta, entonces podemos optar por esta solución. De lo contrario paramos a la última opción.

  1. Abrir con un editor de textos el archivo: conf\httpd.conf en la ubicación donde instalamos Apache
  2. Modificar en la línea que indica “Listen 80” el 80 por otro número de puerto, por ejemplo el 8080
  3. Cambiar el puerto en cada uno de los VirtualHost definidos, si es que los tenemos
  4. Reiniciar el servicio de Apache para que tome la nueva configuración.

Recordar que puede ser necesario desbloquear acceso el web a nuestro equipo, permitiendo el acceso a través del nuevo puerto en el Firewall de Windows.

3. Asegurarse que Apache inicie antes que Skype

Si el problema se debe a que ambas aplicaciones inician automáticamente con Windows, hasta el momento no conozco una forma de lograr (y asegurar) que Apache lo haga ANTES que Skype. Es por eso que en este caso extremo habrá que configurar que Skype no se inicie automáticamente con Windows y dejar que Apache sí lo haga.

Para cambiar esta configuración de Skype:

  1. Iniciar sesión en Skype
  2. Acceder al menú Herramientas > Opciones
    • o bien, presionar Ctrl + ,
  3. Abrir la opción General > Configuración General
  4. Desmarcar la opción “Ejecutar Skype al encender el equipo”
  5. Confirmar con Guardar y reiniciar el equipo

De esta manera Apache adquiere el puerto 80 y luego Skype no puede utilizarlo, pero sí podría utilizar el 443 si mantuvimos la configuración inicial.

Basado en:

http://www.ehow.com/info_12216304_apache-conflict-skype.html

Anuncios

Qué hacer cuando explorer.exe no responde

Más allá de que puede haber cientos de causas para un problema como este, cuando notamos que deja de funcionar la barra de tareas, el menú inicio y el escritorio tenemos que intentar recuperar el control del sistema.

En algunos casos podemos notar que el puntero del mouse se vuelve un aro con un brillo que le da vueltas y/o puede aparecer un cartel indicando “explorer.exe no responde”. Si el origen es casual debido a que usamos una cierta aplicación o intentamos hacer una acción compleja, podemos hacer lo siguiente:

  1. Cerrar todas las aplicaciones posibles
  2. Abrir el administrador de tareas
  3. Acceder a la solapa Procesos
  4. Buscar y seleccionar el proceso cuyo nombre de imagen es “explorer.exe”
  5. Presionar el botón “Finalizar proceso” (abajo a la derecha)
  6. Confirmar la finalización del proceso
  7. Dentro del administrador de tareas, seleccionar del menú Archivo > “Nueva tarea (Ejecutar…)”
  8. Tipear “explorer” y Aceptar

Una vez hecho esto, es posible que todo vuelva a la normalidad. De lo contrario, si ocurre nuevamente o muy a menudo entonces es probable que el problema sea más grave como por ejemplo una aplicación que falla, un malware, un virus o el antivirus mismo.

Solucionar error de child process al ejecutar scripts CGI con código Perl desde Apache

Es posible que cuando intentemos acceder mediante un navegador a un script CGI con código Perl servido por Apache, obtengamos un Internal Server Error (500) y al ver el log de errores correspondiente veamos las siguientes líneas:

[Mon Sep 01 19:26:36 2014] [error] [client 127.0.0.1] (OS 2)El sistema no puede encontrar el archivo especificado.  : couldn't create child process: 720002: script.cgi, referer: http://localhost
[Mon Sep 01 19:26:36 2014] [error] [client 127.0.0.1] (OS 2)El sistema no puede encontrar el archivo especificado.  : couldn't spawn child process: C:/www/script.cgi, referer: http://localhost

En inglés el mensaje es parecido:

[Mon Sep 01 19:26:36 2014] [error] [client 127.0.0.1] (OS 2)The system cannot find the file specified.  : couldn't create child process: 720002: script.cgi, referer: http://localhost
[Mon Sep 01 19:26:36 2014] [error] [client 127.0.0.1] (OS 2)The system cannot find the file specified.  : couldn't spawn child process: C:/www/script.cgi, referer: http://localhost

Para solucionarlo simplemente debemos:

  1. Abrir el script.cgi con un editor de textos
  2. Ver la ruta hacia perl en la primer línea (shebang)
  3. Verificar que el ejecutable de perl esté en esa ruta

Si no hay coincidencia, tenemos 2 alternativas:

  1. Copiar el ejecutable de perl a la ruta donde lo busca el script
    • Lo recomiendo cuando son muchos los scripts que apuntan a esa ruta en el shebang o cuando es la ruta más común “usr/bin/perl
  2. Cambiar la ruta en el script para que apunte al directorio donde está instalado perl
    • Lo recomiendo cuando sea un único script o cuando tenemos perl en el directorio más común “usr/bin

Solucionar error de la extensión curl de PHP en Windows

Supongamos que necesitamos invocar una url a partir de nuestro código PHP. Una forma de hacerlo es mediante la extensión curl. Es posible que en Windows al intentar activarla, no logremos hacer que funcione.

Si el código que la utiliza es similar a:

<?php
  $ch=curl_init();
  curl_setopt($ch,CURLOPT_URL,'http://localhost/');
  curl_exec($ch);
  curl_close($ch);
 ?>

obtendremos el error:

Fatal error: Call to undefined function curl_init()

 

Para solucionarlo debemos primero verificar en el archivo de configuración php.ini que:

  • el directorio de extensiones (extension_dir) sea el correcto
  • la línea extension=php_curl.dll esté descomentada (sin el ; inicial)

A continuación ubicamos el directorio donde está instalado PHP y de allí copiamos los archivos:

  • libeay32.dll
  • ssleay32.dll

al directorio bin dentro de la ubicación donde se encuentra instalado de Apache.

Para finalizar reiniciamos el servicio de Apache.

 

Podemos corroborar que la extensión fue activada exitosamente a través de la información de phpinfo(), mediante un script con el código:

<?php
  phpinfo();
?>

Si volvemos a probar el código del principio veremos que funciona correctamente.

Tratamiento de los errores del módulo DBI de Perl

Cuando utilizamos el módulo DBI para conectarnos a una base de datos en Perl, existen algunos atributos que definen cómo tratar las alertas y errores que sucedan:

PrintWarn

Valor por defecto: Si los warnings de Perl están activados, es 1. De lo contrario, 0.

Controla la impresión de los warnings que determina el driver. Utiliza la función warn.

Como los drivers lo utilizan poco, considero que se puede dejar en el valor por defecto (sea cual fuere)

PrintError

Valor por defecto: 1

Además de devolver los errores de la forma normal, fuerza warnings. Utiliza la función warn.

Considero que es correcto generar los warnings adicionales, manteniendo el valor por defecto, para que se alerten todos los errores.

RaiseError

Valor por defecto: 0

En lugar de devolver los errores de la forma normal, fuerza una excepción. Utiliza la función die. Si está activado, por lo general se desactiva PrintError. Pero si ambos estuvieran activados, se procesa primero PrintError (warning) y luego RaiseError (excepción). En el momento de la conexión, curiosamente, se procesan al revés!

Considero que debe activarse cuando el uso de la base de datos sea esencial para la aplicación (lo más común), de lo contrario la ejecución continúa aún cuando el módulo DBI detecte un error.

 

Los valores por defecto de estos atributos se establecen cuando se realiza la conexión:

my $dbh = DBI->connect("<DBI:CONNECTION>", "<DB_USER>", "<DB_PASS>");

En este caso: PrintWarn depende de si los warnings están activados, PrintError será 1 y RaiseError tendrá el valor 0.

 

Los atributos se pueden redefinir en el momento de la conexión:

my $dbh = DBI->connect("<DBI:CONNECTION>", "<DB_USER>", "<DB_PASS>",{RaiseError => <BOOL>, PrintError => <BOOL>, PrintWarn => <BOOL>});

Ejemplo:

my $dbh = DBI->connect("dbi:mysql:test:localhost:3306", "test", "secure",{RaiseError => 1, PrintError => 0});

En este caso determinamos el forzar una excepción ante un error, desactivando el warning que su hubiera generado en su lugar.

 

También se pueden modificar en cualquier momento posterior para realizar alguna acción en particular:

Ejemplo:

$dbh->{RaiseError} = 0;

 

Se puede agregar código Perl para manejar los warnings y las excepciones generadas en cada caso.

 

Basado en:

http://search.cpan.org/~timb/DBI-1.631/DBI.pm

http://oreilly.com/catalog/perldbi/chapter/ch04.html

Manejar warnings y excepciones en Perl

Cuando el código de nuestro script Perl genera warnings o excepciones ambos se envían al STDERR (una de los flujos estándares de datos). Adicionalmente podemos “atraparlos” (catch) y “manejarlos” (handle) con ciertos bloques de código.

Los warnings se pueden atrapar de la siguiente manera:

local $SIG{__WARN__} = sub {
  my $message = shift;
  #CODIGO DE TRATAMIENTO DE WARNING
};

Ejemplo:

sub db_connect {
  ...
  local $SIG{__WARN__} = sub {
    my $message = shift;
    return 'DB_CONN_ERROR';
  };
  ...
  my $dbh = DBI->connect("dbi:mysql:test:localhost:3306", "test", "secure",{PrintError => 1});

Así, cuando falle la conexión a la base de datos la función devolverá el código de error correspondiente para que la aplicación responda a esa situación.

Las excepciones se pueden atrapar de manera análoga a los warnings:

local $SIG{__DIE__} = sub {
  my $message = shift;
  #CODIGO DE TRATAMIENTO DE EXCEPCION
};

En este caso, también existe una forma alternativa:

eval {
  #CODIGO QUE PUEDE GENERAR EXCEPCION
};
if( $@ ){
  #CODIGO DE TRATAMIENTO DE EXCEPCION
}

Ejemplo:

eval {
  mkpath($ubicacion);
}
if( $@ ){
  $path = $ubicacion;
}

Así, cuando falle la la creación del path indicado en la variable $ubicacion porque el mismo ya existe, se asigna a la variable $path.

Obtener detalles sobre un código de error de MySQL

Cuando ocurre un error de Mysql por lo general se indica el código numérico y su descripción. Cuando solamente indica el código, podemos obtener su descripción ingresando en la línea de comandos:

perror <CODIGO_ERROR>

Obs: Tengan en cuenta que en Windows para poder hacer esto, debemos agregar a la variable Path la ruta al directorio bin de Mysql.

Ejemplo:

Intentamos borrar una base de datos que no existe:

mysql> drop database `db_inexistente`;

-> ERROR 1008 (HY000): Can't drop database 'db_inexistente'; database doesn't exist

Vamos a la línea de comandos e ingresamos:

perror 1008

-> MySQL error code 1008 (ER_DB_DROP_EXISTS): Can't drop database '%-.192s'; database doesn't exist

También podemos probarlo con el error al exceder el max_allowed_packet.

 

Es importante saber que perror nos puede dar información sobre códigos de error del sistema operativo, además de aquellos particulares de Myqsl.

Ejemplo:

Si intentamos importar el dump de una base de datos grande, podríamos obtener el siguiente error:

ERROR 1030 (HY000): Got error 28 from storage engine

Entonces, podemos consultar qué significa el código de error 28 (para el sistema operativo) mediante:

perror 28

-> OS error code  28:  No space left on device

lo cual nos indica que nos hemos quedado sin espacio en disco.

 

Tip adicional: En http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html pueden encontrar el listado de códigos de error de Myqsl 5.5