Ошибка печати Temenos на AIX: Неподдерживаемые флаги lpr (-J и -o) с Semeru Runtime

Вопрос или проблема

Я запускаю приложение 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

Что я пробовал:

  1. Рассматривал возможность понижения до Java 8, так как это может генерировать совместимые команды lpr, и lpr с -j и -o работает нормально, но сейчас установлена Java 11. Примечание: приложение не может работать на java8
  2. Команда lpr работает нормально, когда выполняется вручную без неподдерживаемых флагов (например, lpr -PTESTPRN2 /path/to/file).
  3. Думал о создании оболочки-скрипта для преобразования неподдерживаемых флагов в совместимые с AIX, но не уверен, как это интегрировать с Temenos.
  4. Написал пример java-кода, который использует JPS для печати и получил ту же ошибку с java11, но работает на java8.
  5. Запустил пример 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 флаги не обрабатываются. В то же время, аналогичная команда без этих флагов печатается без ошибок.

Возможные решения

  1. Обновление ваших Java настроек:

    • Поскольку вы уже определили, что Java 11 генерирует неподходящие флаги, наиболее простым решением будет создание обертки для lpr, которая бы удаляла неподдерживаемые флаги перед передачей команды lpr.
  2. Разработка оболочки скрипта:

    • Создав оболочку для команды lpr, вы сможете настраивать параметры, исключая неподдерживаемые флаги. Вот пример, как можно реализовать этот подход:
    #!/bin/bash
    # Скрипт-обертка для lpr
    ARGS=()
    for arg in "$@"; do
       case "$arg" in
           -o*|*-J*) ;; # Игнорировать неподдерживаемые опции
           *) ARGS+=("$arg") ;; 
       esac
    done
    /usr/bin/lpr.original "${ARGS[@]}"
  3. Настройка пути:

    • Создайте исполняемый скрипт в вашей домашней директории и добавьте его в начало переменной окружения 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
  4. Поддержание совместимости с приложением Temenos:

    • Возможно также придется обновить Temenos конфигурацию или использовать специфические API, которые обрабатывают команды печати более корректно, например, отключив ненужные атрибуты или изменив способ их передачи.

Заключение

Ошибка при печати в среде Temenos на AIX – это довольно распространенная проблема, вызванная несовместимостью флагов. Настройка обертки для команды lpr и изменение переменной среды PATH могут значительно улучшить ситуацию и позволить вашему приложению продолжать работу без необходимости возвращаться к Java 8. Подходя к проблеме системно и продуманно, вы сможете найти оптимальное решение.

Если у вас возникнут дополнительные вопросы или потребуется помощь в выполнении этих рекомендаций, не стесняйтесь обращаться за поддержкой.

Оцените материал
Добавить комментарий

Капча загружается...