[URGENTE] error de DPKG al instalar un .deb hecho a base de un script

Hola buenas, tengo .deb hecho a partir de un script, la idea era que el script tuviese varios apt-get install, para que al ejecutar el .deb instalase cosas, pero me sale un fallo: [buuuaaaa] [buuuaaaa] [buuuaaaa]

E: No se pudo bloquear /var/lib/dpkg/lock - open (11: Recurso no disponible temporalmente)
E: No se pudo bloquear el directorio de administración (/var/lib/dpkg/), ¿quizás haya algún otro proceso utilizándolo?


he buscado alternativas al dpkg -i y al apt-get pero no va con nada, el script es este

#!/bin/bash

sudo apt-get update
read -p " "
sudo apt-get install nginx
read -p " "
sudo ufw allow 'Nginx HTTP'
read -p " "
sudo apt-get install mysql-server
read -p " "
sudo apt-get install php5-fpm php5-mysql
read -p " "
sudo cp ~/Escritorio/php.ini /etc/php5/fpm/
sudo service php5-fpm restart
read -p " "
sudo cp ~/Escritorio/default /etc/nginx/sites-available/
read -p "fin de la instalación"



Muchisimas gracias de antemano y un saludo!!! [bye] [bye] [bye] [sonrisa] [sonrisa] [sonrisa]
Supongo que está ejecutando apt de nuevo sin haber acabado el proceso anterior.
@Alecs7k muchas gracias por responder, como puedo hacer para que me haga el apt cuando haya acabado el anterior???
@Alecs7k muchas gracias, lo he probado y el script queda así

#!/bin/bash

while [ -f /var/lib/apt/lists/lock
do
  sleep 3
done


sudo apt-get update;
read -p " "
sudo apt-get install nginx;
read -p " "
sudo ufw allow 'Nginx HTTP';
read -p " "
sudo apt-get install mysql-server;
read -p " "
sudo apt-get install php5-fpm php5-mysql;
read -p " "
sudo cp ~/Escritorio/php.ini /etc/php5/fpm/
sudo service php5-fpm restart
read -p " "
sudo cp ~/Escritorio/default /etc/nginx/sites-available/
read -p "fin de la instalación"


pero sigue sin funcionar [buuuaaaa] [buuuaaaa] [buuuaaaa]
Claro que no te va a funcionar...pensaba que sabías que estabas haciendo.

Después de usar apt-get, pon el while. Así comprobará si se sigue utilizando o no. Si ya no se usa pasará al siguiente apt-get y ahí otra vez otro while. Así hasta el final.

Mejores maneras de hacerlo habrá, pero esto te hará el apaño.
@Alecs7k he puesto eso tras cada apt-get y aunque lo tiene en pausa no hace que se desbloquee, estoy aprendiendo a hacer estas cosas asi que tampoco controlo mucho que digamos

muchisimas gracias de nuevo!!! [360º] [360º] [360º]
Ardeth escribió:@Alecs7k he puesto eso tras cada apt-get y aunque lo tiene en pausa no hace que se desbloquee, estoy aprendiendo a hacer estas cosas asi que tampoco controlo mucho que digamos

muchisimas gracias de nuevo!!! [360º] [360º] [360º]


Es que no debería hacer que se desbloquee. Lo que hace es comprobar si está siendo usado o no para saber si seguir adelante o esperar.
Esto suena a que tienes un servicio de actualizaciones tipo unattended-upgrades de fondo, y ese es el que en ocasiones te bloquea el directorio y recursos de dpkg.

Tu ejecución de apt-get (o 'apt' o 'aptitude' si quieres venir a este siglo) libera sus recursos en cuanto acaba, y dado que no lo lanzas independiente (con &), hasta que uno no acaba, no empieza lo siguiente.
@JanKusanagi, lo que tengo es un .deb que me instale varias cosas, desatendido mas o menos es si.

Entonces poniendo & después de cada apt-get se instalan independientes y no da fallo??? Yo pensaba que con & se ponian en segundo plano.

Y si, sigo en el siglo anterior con apt-get [carcajad] [carcajad] [carcajad] el profesor siempre nos enseñó con apt-get, y lo intentr con aptitude el otro dia y tampoco iba
Ardeth escribió:@JanKusanagi, lo que tengo es un .deb que me instale varias cosas, desatendido mas o menos es si.

A ver, no hablaba de tu script. Digo que tu sistema tiene algún servicio de actualizaciones de fondo, que te está jodiendo.
Creo que no has dicho que sistema usas, pero del uso intensivo de "sudo-pa-to", deduciré que es Ubuntu, y Ubuntu tiene dichos servicios activados de serie.

Entonces poniendo & después de cada apt-get se instalan independientes y no da fallo??? Yo pensaba que con & se ponian en segundo plano.

No, si precisamente lo que digo es que está bien que los lances SIN &, pero que entonces es totalmente secuencial, y una ejecución de apt-get no bloqueará a la siguiente. No tendría sentido: empieza, ACABA, sigue el script con la llamada al siguiente apt-get.

Y si, sigo en el siglo anterior con apt-get [carcajad] [carcajad] [carcajad] el profesor siempre nos enseñó con apt-get, y lo intentr con aptitude el otro dia y tampoco iba

Bueno, no hace falta que el dios profe enseñe las herramientas actualizadas, para ponerse uno mismo un poco al día. Jamás he usado "apt-get" ni el resto de la familia apt-* en Debian, porque Aptitude le da 200 patadas, pero es que ahora la herramienta "apt" reemplaza oficialmente al obsoleto apt-get y compañía.
@JanKusanagi

A ver, no hablaba de tu script. Digo que tu sistema tiene algún servicio de actualizaciones de fondo, que te está jodiendo.
Creo que no has dicho que sistema usas, pero del uso intensivo de "sudo-pa-to", deduciré que es Ubuntu, y Ubuntu tiene dichos servicios activados de serie.


Si, es Ubuntu 14, y como puedo hacer para quitar ese servicio??? con el kill PDI???

No, si precisamente lo que digo es que está bien que los lances SIN &, pero que entonces es totalmente secuencial, y una ejecución de apt-get no bloqueará a la siguiente. No tendría sentido: empieza, ACABA, sigue el script con la llamada al siguiente apt-get.


da igual con & que sin el, no me funciona de ninguna forma
Ardeth escribió:da igual con & que sin el, no me funciona de ninguna forma


Un ejemplo:

Imagen

Primero escribe pepe, si todo va bien usa figlet y pon pepe, si todo va bien usa cowsay y pon pepe con lolcat.
Como todo ha acabado corectamente ha ejecutado la siguiente orden tras la anterior, si no hubiera acabado bien la siguiente orden no se hubiera ejecutado. Esto asi a grandes rasgos que ahora estoy liado y no puedo ponertelo mas extenso.

En este ejemplo he provocado un error en la segunda orden con lo que solo se ha ejecutado la primera y se ha detenido a partir de la segunda que es incorrecta, lo demas ya no se ejecuta por que no acabo bien.

Imagen

Pruebalo y nos cuentas.
JanKusanagi escribió:& != &&

Ya pero si ponermos el ampersand solitario solo se salta la orden incorrecta y continua con el resto, con mi ejemplo se detiene en la orden incorrecta. Luego me lo miro con mas detalle es que ahora me pillais medio comiendo medio compilando otras cosas. y no he leido el hilo desde el principio.
(mensaje borrado)
yo estoy algo perdido, que archivo .deb has generado con un script? al instalar el paquete .deb ejecuta ese script? el .deb pretende ser una especie de metapackage?
lo que dice el casual.

Si un script dentro de un .deb intenta usar apt, siempre se encontrara con el lock que su propia instalacion establece hasta que termina.

Si lo que quieres es un metapaquete con X dependencias, genera eso, un metapaquete y no un .deb que en sus scripts internos llame a apt.
Hola compi te hecho esto creo que es la mejor manera a mi entender de hacerlo espero que te ayude, no lo he probado porque no tengo los repos esos ni los archivos que tienes copiado en el directorio home asi que ... Recuerda que al estar como root por defecto no tiene /home por lo cual ~ redirige a /root la solucion mas correcta seria hacer un pueño submenu en el cual saque los nombre de los usuarios del sistema y guardar en una variable su directorio, por otro lado puede que algun nombre de paquete sea erroneo. saludos y espero que te sirva


#!/bin/bash
#script instalacion de paquetes
#hecho por elkubano para elotrolado
#v1
#para ejecurtar este script tienes que ser root

#variables
#menu
menu="actualiza_repo instalacion_paquetes copia_ficheros abrir_firewall salir"

#error
error1="tienes que ser root"
error2="verifique la coneccion de internet"
error3="no se ha podido instalar el paquete intenter usar la opcion apt-get install -f"
error4="el fichero no existe"
error5="no se añadido la regla al firewall error"
error6="el proceso no se ha podido reiniciar"
#ok
ok1="se ha instalado correctamente"
ok2="se a actualizado correctamente"
ok3="se a copiado el fichero correctamente"
ok4="se añadido la regla al firewall"
ok5="se ha reiniciado correctamente el proceso"
#Verificacion de root
if [ "$(whoami)" != 'root' ]
then
  echo "$error1"
exit
fi

opcion=($menu)
  select opt in "${opcion[@]}"
    do
      case $opt in

      "${opcion[0]}" )
    echo "ha seleccionado ${opcion[0]}"
    apt-get update && apt-get upgrade
    codigo=$?
      if [[ $codigo = 0 ]]
        then
        echo "$ok1"
          else
           echo "$error2"
       fi
    ;;

    "${opcion[1]}" )
    echo "a selecionado ${opcion[1]}"
    apt-get install nginx Nginx HTTP mysql-server php5-fpm php5-mysql
#comprobamos que se ejecuto todo correctamente
      codigo=$?
        if [[ $codigo = 0 ]]
          then
          echo "$ok1"
            else
             echo "$error3"
         fi
    ;;
   
    "${opcion[2]}" )
      echo "a selecionado ${opcion[2]}"
  # esta paramos el proceso con el superdemonio y luego lo iniciamos es mucho mejor que el restart "suele fallar"
  /etc/init.d/php5-fpm stop
  #Verificacion de el reinicio del demonio
  codigo=$?
    if [[ $codigo = 0 ]]
      then
      echo "$ok5"
        else
         echo "$error6"
     fi
  #copia de ficheros
#verificamos que el fichero existe
      if [ -f ~/Escritorio/php.ini ];
               then
                    cp ~/Escritorio/php.ini /etc/php5/fpm/
#iniciamos el demonio
                     /etc/init.d/php5-fpm start
          echo "$ok3"
            else
             echo "$error4"
         fi
         if [ -f ~/Escritorio/default ];
                  then
                       cp ~/Escritorio/default /etc/nginx/sites-available/
             echo "$ok3"
               else
                echo "$error4"
            fi
   
      ;;

    "${opcion[3]}" )
      echo "a selecionado ${opcion[3]}"
      ufw allow 'Nginx HTTP'
      codigo=$?
        if [[ $codigo = 0 ]]
          then
          echo "$ok4"
            else
             echo "$error5"
         fi
   
      ;;

     
      "${opcion[4]}" )
         echo "bye"
         exit 0
      ;;

      * )
    echo "opcion no valida seleccione un numero del 1 al 5"
      ;;

  esac

done
18 respuestas