Bash-скрипт (с java-командой) не завершается (скрипт 2)

В вашем ld.so.preload вы хотите указать «$ LIB» в своем пути, а не явные «lib» или «lib64». Таким образом, в дистрибутиве в стиле Redhat "/usr/alternates/$LIB/libfoo.so" становится "/usr/alternates/lib/libfoo.so" для 32-битного процесса и "/ usr / alternates / lib64 /". libfoo.so "для 64-битного процесса. В дистрибутиве в стиле Debian "/usr/alternates/$LIB/libfoo.so" становится "/usr/alternates/lib/i386-linux-gnu/libfoo.so" и "/ usr / alternates / x86_64-linux-" gnu / libfoo.so "соответственно. Затем ваше дерево необходимо заполнить библиотеками для обеих архитектур.

См. «Расширение токена rpath» на ld.so (8) странице руководства для получения дополнительной информации.

Обратите внимание, что вместо предварительной загрузки библиотеки, если вы компилируете двоичные файлы, загрузку которых вы пытаетесь изменить, вам может быть лучше изменить пути, установив DT_RUNPATH в строке ссылки (используя те же пути в стиле "$ LIB", тем самым настраивая двоичный файл так, чтобы он предпочитал расположение вашей библиотеки системным значениям по умолчанию.

В качестве альтернативы, как отмечали другие, вы можете отредактировать файл ELF, чтобы установить DT_RUNPATH для двоичных файлов, которые вы не компилируется.

В системе x86_64 Centos 6.5 у меня работает следующее:

cd /tmp
mkdir lib lib64
wget http://carrera.databits.net/~ksb/msrc/local/lib/snoopy/snoopy.h
wget http://carrera.databits.net/~ksb/msrc/local/lib/snoopy/snoopy.c
gcc -m64 -shared -fPIC -ldl snoopy.c -o /tmp/lib64/snoopy.so
gcc -m32 -shared -fPIC -ldl snoopy.c -o /tmp/lib/snoopy.so
cat > true.c < /etc/ld.so.preload"
strace -fo /tmp/strace64.out /tmp/true64
strace -fo /tmp/strace32.out /tmp/true32
sudo rm /etc/ld.so.preload"

В выводе strace strace64.out содержит:

open("/tmp/lib64/snoopy.so", O_RDONLY) = 3

, а strace32.out:

open("/tmp/lib/snoopy.so", O_RDONLY) = 3

Это с ld.so .preload содержимое:

/tmp/$LIB/snoopy.so

1
06.08.2015, 22:19
1 ответ

Наконец-то я нашел решение.

Насколько я понял, это был способ включить оба процесса в моем сценарии 2 в фоновый режим. Похоже, что и применимы только к awk ] (это объясняет, почему он работает без awk).

С помощью фигурных скобок я могу поместить в фон обе части (java и awk):

Скрипт 2 выполняется из скрипта 1:

#!/bin/bash

# Start java app with date added by awk at the beginning of every line
{ java -cp .:./lib/* com.mypackage.MyClass 2>&1 | awk '{print strftime("%D %T",systime())" "$0 }'; } &>> logFile.log &

Всем спасибо!

0
28.01.2020, 01:36

Теги

Похожие вопросы