我有一个使用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)
在iclis09b.so上以root用户身份而不是登录用户身份运行ldd时,我得到了不同的结果:
为了解决这个问题,我添加了以下符号链接,脚本现在将作为服务运行
我实际上已经创建了符号链接,但仍然在libifglx.so和libifgls.so上找到了“not found”。此外,我还向/etc/environment和/etc/profile添加了搜索路径,我看到它正在运行
echo $LD_LIBRARY_PATH
,但在手动生成导出变量之前,无法从shell运行python脚本。Systemd服务也没有启动正确的解决方案是使用显式路径
/opt/IBM/informix
,而不是$LD_LIBRARY_PATH
中的$INFORMIXDIR
和其他变量。出于某种原因,嵌套变量不适用相关问题 更多 >
编程相关推荐