作为服务运行时找不到ODBC库

时间:2020-07-23 22:23:40

标签: python odbc pyodbc informix systemd

我有一个脚本,该脚本使用pyodbc对Informix数据库执行查询。如果尝试将其作为外壳运行,该脚本运行良好,但是当我将其设置为在systemd中作为服务运行时,会收到以下错误:

Jul 23 21:52:39 <server name redacted> database_to_domo.py[16368]: pyodbc.Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib '/opt/IBM/informix/lib/cli/iclis09b.so' : file not found (0) (SQLDriverConnect)")

当我尝试从外壳程序运行它时,我最初收到此错误,但是通过使自己成为/ opt / IBM目录及其子目录的所有者来解决此问题。

我尝试通过将权限设置为777来修复作为服务运行时的问题,但这没有用。这是我对服务的配置:

[Unit]
Description=UCCX data uploader for Domo

[Service]
User=A683040
Environment=INFORMIXDIR=/opt/IBM/informix
Environment=LD_LIBRARY_PATH=$INFORMIXDIR/lib:$INFORMIXDIR/lib/cli:$INFORMIXDIR/lib/esql
Environment=INFORMIXSQLHOSTS=$INFORMIXDIR/etc/sqlhosts
WorkingDirectory=/home/a683040/uccx-domo-data
ExecStart=/home/a683040/uccx-domo-data/database_to_domo.py

[Install]
WantedBy=multi-user.target

该库存在于找不到该库的路径中。这是我的ldd输出:

$ ldd /opt/IBM/informix/lib/cli/iclis09b.so
 linux-vdso.so.1 =>  (0x00007ffc06b9b000)
 libifgls.so => /opt/IBM/informix/lib/esql/libifgls.so (0x00007f39b479b000)
 libifglx.so => /opt/IBM/informix/lib/esql/libifglx.so (0x00007f39b4599000)
 libm.so.6 => /lib64/libm.so.6 (0x00007f39b4297000)
 libdl.so.2 => /lib64/libdl.so.2 (0x00007f39b4093000)
 libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f39b3e5c000)
 libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f39b3c40000)
 libc.so.6 => /lib64/libc.so.6 (0x00007f39b3872000)
 /lib64/ld-linux-x86-64.so.2 (0x00007f39b4da7000)
 libfreebl3.so => /lib64/libfreebl3.so (0x00007f39b366f000)

2 个答案:

答案 0 :(得分:1)

我实际上已经创建了符号链接,但在 libifglx.so 和 libifgls.so 上仍然“找不到”。此外,我已将搜索路径添加到 /etc/environment 和 /etc/profile,我看到它运行 echo $LD_LIBRARY_PATH 但无法从 shell 运行 python 脚本,直到我手动创建导出变量。 Systemd 服务也没有启动。

正确的解决方案是在 /opt/IBM/informix 和其他变量中使用显式路径 $INFORMIXDIR 而不是 $LD_LIBRARY_PATH。出于某种原因,嵌套变量没有应用。

答案 1 :(得分:0)

当在iclis09b.so上以root身份运行ldd时,而不是我的登录用户,我得到了不同的结果:

$ sudo ldd -v /opt/IBM/informix/lib/cli/iclis09b.so
 linux-vdso.so.1 =>  (0x00007fff9d6fd000)
 libifgls.so => not found
 libifglx.so => not found
 libm.so.6 => /lib64/libm.so.6 (0x00007f9c2b1ef000)
 libdl.so.2 => /lib64/libdl.so.2 (0x00007f9c2afeb000)
 libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f9c2adb4000)
 libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f9c2ab98000)
 libc.so.6 => /lib64/libc.so.6 (0x00007f9c2a7ca000)
 /lib64/ld-linux-x86-64.so.2 (0x00007f9c2b8aa000)
 libfreebl3.so => /lib64/libfreebl3.so (0x00007f9c2a5c7000)

为解决此问题,我添加了以下符号链接,该脚本现在将作为服务运行。

$ sudo ln -s /opt/IBM/informix/lib/esql/libifgls.so /lib64/libifgls.so
$ sudo ln -s /opt/IBM/informix/lib/esql/libifglx.so /lib64/libifglx.so
$ sudo ln -s /opt/IBM/informix/lib/esql/libifgls.so /opt/IBM/informix/lib/cli/libifgls.so
$ sudo ln -s /opt/IBM/informix/lib/esql/libifglx.so /opt/IBM/informix/lib/cli/libifglx.so