antecedentes
Vine aquí temprano esta mañana, recibí un saludo de un estudiante de front-end en WeChat y me publiqué un error. ¿Por qué no puedo iniciar sesión en el entorno de mit?
En un instante, recordé que las 3 máquinas en el entorno mit se detuvieron para depurar una función, lo que también provocó que el websocket anterior no pudiera iniciar sesión (PS: Android e ios inician sesión obteniendo direcciones IP dinámicas a través de el servicio de equilibrio de carga desarrollado por ellos mismos. Por lo tanto, no se verá afectado. Pero la web usa nginx + nombre de dominio, y las 3 máquinas asignadas por el nombre de dominio se detienen y definitivamente no podrán iniciar sesión).
Date prisa y saca la herramienta jenkins que creaste e implementa N máquinas con un solo clic. No es demasiado genial:
CICD usa Jenkins en combate real para lograr la implementación automatizada y el aislamiento del entorno.
PD: El principio de funcionamiento de jenkins es aproximadamente como se muestra en la figura anterior. Cada vez que compila, primero extrae un código de github / gitlab, y después de la compilación (escriba su propio script), puede distribuirlo a múltiples máquinas que necesitan para ser implementado para implementación (escriba su propio script para controlar).
1. Haga clic en Build
2. Vea el resultado de la consola.
Encontré que todo es normal, pero el proceso simplemente no se inicia. ¿Cuál es el problema?
[root@10-0-59-178 webapps]# ls
online.base.immsgserver.service online.base.immsgserver.service.202006026
Entonces, lo ejecuté manualmente:
¿Por qué no puedo encontrar libdb-4.7.so?
[root@10-0-59-178 msg_server]# whereis libdb-4.7.so
libdb-4.7:[root@10-0-59-178 msg_server]#
[root@10-0-59-178 msg_server]# whereis libdb-5.3.so
libdb-5.3: /usr/lib64/libdb-5.3.so
la razón
Para averiguar el motivo, utilicé ldd para ver las dependencias:
Máquinas que no se pueden ejecutar: Máquinas que
funcionan bien:
¿Por qué?
Al final, después de pasar más de una hora , descubrí que el log4cxx.so previamente compilado se usó directamente en el script build.sh en lugar de recompilar log4cxx cada vez.
copy_libs(){
# lib
# 解决jekins发布job编译过长问题,故提前编译好protobuf、log4cxx、hiredis等,节约时间
cp ${CUR_DIR}/lib/linux/* ${CUR_DIR}/lib/
}
Entonces, simplemente vuelva a compilar log4cxx. ldd mira el compilado:
[root@10-0-59-231 linux]# ldd liblog4cxx.so
linux-vdso.so.1 => (0x00007ffd36155000)
libaprutil-1.so.0 => /usr/lib64/libaprutil-1.so.0 (0x00007f8597d0b000)
libldap_r-2.4.so.2 => /usr/lib64/libldap_r-2.4.so.2 (0x00007f8597aab000)
liblber-2.4.so.2 => /usr/lib64/liblber-2.4.so.2 (0x00007f859789c000)
libexpat.so.1 => /usr/lib64/libexpat.so.1 (0x00007f8597672000)
libdb-5.3.so => /usr/lib64/libdb-5.3.so (0x00007f85972b2000)
para resumir
Entonces, ¿por qué a los programadores de Linux les gusta compilar el código fuente de una biblioteca dependiente ? Creo que una de las razones es evitar el problema de bibliotecas dependientes no encontradas debido a entornos inconsistentes .
Apéndice
1. Comando ldd para ver dependencias
ldd msg_server
linux-vdso.so.1 => (0x00007fff3d4fc000)
libslog.so => ./libslog.so (0x00007fad6a9be000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007fad6a555000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fad6a339000)
libssl.so.10 => /lib64/libssl.so.10 (0x00007fad6a0c7000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fad69dbd000)
libm.so.6 => /lib64/libm.so.6 (0x00007fad69abb000)
2.ldd solo muestra no encontrado:
ldd msg_server |grep "not found"
Producción
libdb-4.7.so => not found
3. Desmontaje de Objdump para ver las bibliotecas dependientes que faltan
objdump -x liblog4cxx.so|grep NEEDED
Producción
[root@10-0-59-178 msg_server]# objdump -x liblog4cxx.so|grep NEEDED
NEEDED libaprutil-1.so.0
NEEDED libldap-2.4.so.2
NEEDED liblber-2.4.so.2
NEEDED libexpat.so.1
NEEDED libdb-4.7.so
NEEDED libapr-1.so.0
NEEDED libpthread.so.0
NEEDED libstdc++.so.6
NEEDED libm.so.6
NEEDED libc.so.6
NEEDED libgcc_s.so.1