2013-08-20 2 views
5

У меня есть набор Java-программ, которые используются в качестве инструментов командной строки на наших серверах Linux. Большинство из них используют класс, который печатает индикатор выполнения на STDERR, аналогичный Term::ProgressBar от Perl.Определение того, собирается ли STDERR на терминал

Я бы хотел, чтобы индикатор выполнения показывался всякий раз, когда STDERR отправляется на терминал и автоматически отключается, когда STDERR перенаправляется, так что в перенаправленных данных не все виды индикаторов выполнения.

Проверка System.console() == null была моей первой мыслью, но перенаправление STDOUT достаточно, чтобы сделать это true, даже если STDERR все еще идет к терминалу. Есть ли что-нибудь, что я могу проверить, что характерно для STDERR? Решение, специфичное для Linux, или использующее собственные API, было бы в порядке для моих нужд.

+0

http://stackoverflow.com/questions/3643939/java-process-with-input-output-stream Наслаждайтесь – UberDoyle

+0

@UberDoyle I «Не спрашивайте о запуске другого процесса с использованием Java. Я хочу знать, перенаправляется ли STDERR * текущего * процесса. –

ответ

1

Я думаю, что вы ищете isatty(3), в unistd.h. Невозможно определить, был ли переназначен дескриптор файла, период, но это скажет вам, является ли он еще интерактивным. См. Источник для команды tty в GNU coreutils.

+0

Знаете ли вы, какую функцию в ioctl я должен смотреть? Ничто не выделяется мне после прочтения ['ioctl'] (http://www.linuxmanpages.com/man2/ioctl.2.php), [' tty_ioctl'] (http://www.linuxmanpages.com/man4 /tty_ioctl.4.php) и ['console_ioctl'] (http://www.linuxmanpages.com/man4/console_ioctl.4.php). –

+0

Ответ отредактирован после того, как я понял, где искать. – chrylis

+0

@ user2284570 Да, потому что это невозможно сделать на Java. Следующий? – chrylis

0

После объединения @chrylis's pointer с this answer и делать немного настройки, что я наконец-то закончилось вверх с:

  1. создания и компиляции класса Java с родной сигнатуры метода
  2. использования javah генерировать C заголовочный файл
  3. создать .cpp файл, реализующий функция с isatty
  4. компилировать код на C++ в общую библиотеку
  5. запустить программу Java, используя -Djava.library.path=..., чтобы сказать ему, где пользовательская библиотека

Java класс:

package com.example.cli; 

class LinuxTerminalSupport { 

    public native boolean isStderrVisible(); 

    static { 
     System.loadLibrary("term"); 
    } 
} 

муравей мишень для генерации .h:

<target name="generate-native-headers"> 
    <javah destdir="native/" verbose="yes"> 
     <classpath refid="compile.class.path"/> 
     <class name="com.example.cli.LinuxTerminalSupport" /> 
    </javah> 
</target> 

.cpp файл:

#include "com_example_cli_LinuxTerminalSupport.h" 
#include "unistd.h" 

using namespace std; 

JNIEXPORT jboolean JNICALL Java_com_example_cli_LinuxTerminalSupport_isStderrVisible(JNIEnv * env, jobject obj) { 
    return isatty(fileno(stderr)) == 1; 
} 

Makefile (изменение Java включает в себя, чтобы отразить ваше $JAVA_HOME):

linux: LinuxTerminalSupport.o 
    g++ -I/usr/java/jdk1.6.0_13/include -I/usr/java/jdk1.6.0_13/include/linux \ 
      -o libterm.so -shared -Wl,-soname,term.so LinuxTerminalSupport.o -lc 

LinuxTerminalSupport.o: LinuxTerminalSupport.cpp 
    g++ -c -I/usr/java/jdk1.6.0_13/include -I/usr/java/jdk1.6.0_13/include/linux LinuxTerminalSupport.cpp 
+0

Вам не нужно было создавать библиотеку для этого (см. [НЕ ДОПУСКАЕТСЯ ЗДЕСЬ] (https: //en.wikipedia.орг/вики/Not_invented_here # In_computing)). isatty() уже является частью таблицы экспорта двоичных файлов glibc и может быть найден через /lib64/libc.so.6 или /lib/lib.so.6 (также, пожалуйста, сообщите @ мне, поскольку я не проверяю ответы вручную) – user2284570

+0

@ пользователь2284570 - I * сделал * использование 'isatty'. Если вы знаете, как использовать собственные библиотеки без оболочки JNI, тогда вы должны сказать нам, что я никогда не видел никакой информации об этом. –

+0

@ Пользователь BradMace понятия не имеет, о чем он говорит. – chrylis

 Смежные вопросы

  • Нет связанных вопросов^_^