作为服务运行时未找到 ODBC Lib
Posted
技术标签:
【中文标题】作为服务运行时未找到 ODBC Lib【英文标题】:ODBC Lib Not Found When Running As Service 【发布时间】:2020-07-23 22:23:40 【问题描述】:我有一个使用 pyodbc 对 Informix 数据库执行查询的脚本。如果我尝试将其作为 shell 运行,该脚本运行良好,但是当我将其设置为在 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)")
我最初在尝试从 shell 运行它时收到此错误,但通过使自己成为 /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)
【问题讨论】:
也许您的服务没有拾取环境或正在使用不同的 python (32 vs 64) 来运行脚本。如果您将服务中的“ExecStart”更改为“strace -o /tmp/trace.txt python ...../database_to_domo.py”之类的内容,以了解真正想要做什么。此外,这并不重要,但您的 DSN 应该使用“iclit09b.so”而不是“iclis09b.so”(“s”用于单线程)。 【参考方案1】:当以 root 身份在 iclis09b.so 上运行 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
【讨论】:
【参考方案2】:我实际上创建了符号链接,但在 libifglx.so 和 libifgls.so 上仍然“找不到”。我还添加了到 /etc/environment 和 /etc/profile 的搜索路径,我看到它正在运行 echo $LD_LIBRARY_PATH
但在我手动创建导出变量之前无法从 shell 运行 python 脚本。 Systemd 服务也没有启动。
正确的解决方法是在$LD_LIBRARY_PATH
等变量中使用显式路径/opt/IBM/informix
而不是$INFORMIXDIR
。由于某种原因,嵌套变量没有应用。
【讨论】:
以上是关于作为服务运行时未找到 ODBC Lib的主要内容,如果未能解决你的问题,请参考以下文章
当 XAMPP 作为服务运行时,页面无法连接 ODBC 服务器(在 Windows Server 2008 上)
运行 Xcode 测试时未找到 FBSnapshotTestCase 图像