Вопрос или проблема
Я запускаю приложение Temenos на системе AIX7.3, настроенной с помощью AIX spooler. Команда lpr работает нормально при ручном тестировании. Однако, когда приложение пытается распечатать с использованием API java.io.PrintService в Java, я сталкиваюсь со следующей ошибкой:
java.io.IOException: error=254 running: '/usr/bin/lpr' '-PTESTPRN2' '-J Java Printing' '-o job-sheets=standard' '/tmp/javaprint13160595099572358650'
usage: lpr [-fghjlmnprs] [-PPrinter] [-#NumberCopies] [-CClass]
[-JJob] [-TTitle] [-iNumberColumns] [-wWidth] [Filename ...]
Похоже, что код Java, вызываемый Temenos, генерирует команду lpr с флагами (-J и -o), которые не поддерживаются реализацией lpr в AIX. Спулер настроен правильно и печатает без проблем, когда команды выполняются вручную:
lpr -PTESTPRN2 /etc/hosts
Что я пробовал:
- Рассматривал возможность понижения до Java 8, так как это может генерировать совместимые команды lpr, и lpr с -j и -o работает нормально, но сейчас установлена Java 11. Примечание: приложение не может работать на java8
- Команда lpr работает нормально, когда выполняется вручную без неподдерживаемых флагов (например, lpr -PTESTPRN2 /path/to/file).
- Думал о создании оболочки-скрипта для преобразования неподдерживаемых флагов в совместимые с AIX, но не уверен, как это интегрировать с Temenos.
- Написал пример java-кода, который использует JPS для печати и получил ту же ошибку с java11, но работает на java8.
- Запустил пример java-кода с оболочкой-скриптом, он работает, но все равно от Temenos поступает та же ошибка.
Пример java-кода для тестирования
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import java.io.*;
public class PrintHostsFileWithQueue {
public static void main(String[] args) {
String printerName = "TESTPRN2"; // Замените на имя вашей очереди печати
try {
// Укажите файл для печати
File file = new File("/etc/hosts");
if (!file.exists()) {
System.out.println("Файл /etc/hosts не существует.");
return;
}
// Создайте FileInputStream для файла
FileInputStream fis = new FileInputStream(file);
// Определите тип документа (обычный текст)
DocFlavor flavor = DocFlavor.INPUT_STREAM.TEXT_PLAIN_UTF_8;
PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
attributes.add(new Copies(1)); // Количество копий
attributes.add(new JobSheets(JobSheets.NONE, JobSheets.NONE));
// Получите все доступные сервисы печати
PrintService[] printServices = PrintServiceLookup.lookupPrintServices(flavor, null);
// Найдите указанную очередь печати
PrintService selectedService = null;
for (PrintService service : printServices) {
if (service.getName().equalsIgnoreCase(printerName)) {
selectedService = service;
break;
}
}
if (selectedService == null) {
System.out.println("Принтер с именем '" + printerName + "' не найден.");
fis.close();
return;
}
// Создайте задание на печать
DocPrintJob printJob = selectedService.createPrintJob();
// Создайте объект Doc, обернув входной поток
Doc doc = new SimpleDoc(fis, flavor, null);
// Отправьте документ на печать
printJob.print(doc, null);
System.out.println("Печать /etc/hosts на принтер: " + printerName);
fis.close();
} catch (FileNotFoundException e) {
System.out.println("Файл не найден: " + e.getMessage());
} catch (PrintException e) {
System.out.println("Ошибка при печати: " + e.getMessage());
} catch (IOException e) {
System.out.println("Ошибка закрытия файла: " + e.getMessage());
}
}
}
Оболочка-скрипт
#!/bin/bash
# Шаг 1: Резервное копирование существующего двоичного файла lpr
if [ -f /usr/bin/lpr ]; then
echo "Резервное копирование существующего /usr/bin/lpr..."
mv /usr/bin/lpr /usr/bin/lpr.original
else
echo "/usr/bin/lpr не существует. Выход."
exit 1
fi
# Шаг 2: Создание нового скрипта-обертки lpr
echo "Создание нового скрипта-обертки /usr/bin/lpr..."
cat /dev/null
#!/bin/bash
# Удалите неподдерживаемые опции и передайте другие оригинальному lpr
ARGS=()
for arg in "$@"; do
case "$arg" in
-o*|*-J*) ;; # Игнорировать неподдерживаемые опции
*) ARGS+=("$arg") ;;
esac
done
/usr/bin/lpr.original "${ARGS[@]}"
EOF
# Шаг 3: Сделать новый скрипт исполняемым
echo "Делаем /usr/bin/lpr исполняемым..."
chmod +x /usr/bin/lpr
# Шаг 4: Подтверждение изменения
echo "Скрипт-обертка lpr был создан и теперь исполняем."
echo "Проверьте команду печати, чтобы подтвердить, что она работает."
Вы можете использовать $PATH
, чтобы решить вашу проблему.
mkdir $HOME/earlybin
Затем создайте исполняемый скрипт в $HOME/earlybin/lpr
, который передает все параметры, кроме неподходящих, в /usr/bin/lpr
.
Затем, в вашем файле запуска (~/.bashrc
) добавьте:
PATH=$HOME/earlybin:$PATH
Ответ или решение
Темы: Ошибки печати в Temenos на AIX: неподдерживаемые флаги lpr (-J и -o) с использованием Semeru Runtime
Ваша проблема заключается в использовании флагов командной строки -J
и -o
, которые не поддерживаются в реализации команды lpr
на AIX системе 7.3. Ниже приведены подробные шаги и рекомендации, которые помогут устранить эту проблему.
Анализ проблемы
Вы пытаетесь запустить приложение Temenos на AIX 7.3, используя печать через java.io.PrintService API
. Определённые флаги, используемые в команде lpr
, вызывают ошибки, так как они не поддерживаются вашей конфигурацией. Исполнение команды вручную работает корректно, что подтверждает корректную настройку спуллера.
Проблемный момент
Ошибка:
java.io.IOException: error=254 running: '/usr/bin/lpr' '-PTESTPRN2' '-J Java Printing' '-o job-sheets=standard' '/tmp/javaprint13160595099572358650'
usage: lpr [-fghjlmnprs] [-PPrinter] [-#NumberCopies] [-CClass] [-JJob] [-TTitle] [-iNumberColumns] [-wWidth] [Filename ...]
Указывает на то, что -J
и -o
флаги не обрабатываются. В то же время, аналогичная команда без этих флагов печатается без ошибок.
Возможные решения
-
Обновление ваших Java настроек:
- Поскольку вы уже определили, что Java 11 генерирует неподходящие флаги, наиболее простым решением будет создание обертки для
lpr
, которая бы удаляла неподдерживаемые флаги перед передачей командыlpr
.
- Поскольку вы уже определили, что Java 11 генерирует неподходящие флаги, наиболее простым решением будет создание обертки для
-
Разработка оболочки скрипта:
- Создав оболочку для команды
lpr
, вы сможете настраивать параметры, исключая неподдерживаемые флаги. Вот пример, как можно реализовать этот подход:
#!/bin/bash # Скрипт-обертка для lpr ARGS=() for arg in "$@"; do case "$arg" in -o*|*-J*) ;; # Игнорировать неподдерживаемые опции *) ARGS+=("$arg") ;; esac done /usr/bin/lpr.original "${ARGS[@]}"
- Создав оболочку для команды
-
Настройка пути:
- Создайте исполняемый скрипт в вашей домашней директории и добавьте его в начало переменной окружения PATH, что обеспечит его приоритет над системными командами.
mkdir $HOME/earlybin cp /path/to/your/wrapper_script.sh $HOME/earlybin/lpr chmod +x $HOME/earlybin/lpr echo "PATH=$HOME/earlybin:$PATH" >> ~/.bashrc source ~/.bashrc
-
Поддержание совместимости с приложением Temenos:
- Возможно также придется обновить Temenos конфигурацию или использовать специфические API, которые обрабатывают команды печати более корректно, например, отключив ненужные атрибуты или изменив способ их передачи.
Заключение
Ошибка при печати в среде Temenos на AIX – это довольно распространенная проблема, вызванная несовместимостью флагов. Настройка обертки для команды lpr
и изменение переменной среды PATH могут значительно улучшить ситуацию и позволить вашему приложению продолжать работу без необходимости возвращаться к Java 8. Подходя к проблеме системно и продуманно, вы сможете найти оптимальное решение.
Если у вас возникнут дополнительные вопросы или потребуется помощь в выполнении этих рекомендаций, не стесняйтесь обращаться за поддержкой.