Передача данных программам в качестве сервиса [закрыто]

-2
19.09.2017, 12:36
2 ответа

У вас есть два основных способа решить эту проблему.

Перенаправить стандартный ввод с tty на ваше приложение

По умолчанию системы загружаются с tty1, вы можете отключить getty, работающий на этом tty, и использовать его ввод для ваших целей. Сначала отключите getty в системе

sudo systemctl stop getty@tty1.service
sudo systemctl disable getty@tty1.service

Вы должны сделать это из сеанса ssh или другого getty, иначе вы потеряете свой логин. Вы не упомянули свою систему, но с systemd это так -обратитесь к документации вашего дистрибутива, если это не работает для вас

Теперь нам нужно создать скрипт-оболочку, содержащий ваше приложение для перенаправления /dev/tty1на стандартный ввод вашей программы (</dev/tty1в конце):/usr/local/bin/rxtxcomm

#!/bin/bash
/usr/bin/java -Djava.library.path=/usr/lib/jni \
  -cp /usr/share/java/RXTXcomm.jar -jar '/foo/bar.jar' </dev/tty1

И сделать его исполняемым с помощью:

sudo chmod +x /usr/local/bin/rxtxcomm

Затем обновите служебный файл, чтобы вместо него запускался этот скрипт. Перезапустите службу, и она должна подключить свой стандартный ввод к /dev/tty1.

Вы можете попробовать это вручную, выполнив приведенную выше команду в другом сеансе tty или ssh, но вам нужно запустить ее от имени пользователя root (или изменить разрешения на tty ). Обратите внимание, что с этим решением вы должны быть на tty1, чтобы он мог захватить любой ввод (alt+ctrl+F1 на большинстве систем ). Кроме того, для этого вы должны быть root (, служебные файлы которого по умолчанию ), или пользователь, которого вы запускаете, должен иметь доступ для чтения с tty напрямую.

Чтение непосредственно из/dev/input/

Почти все устройства в Linux доступны в виде файлов внутри /dev. Клавиатуры доступны в /dev/input/. Вы можете изменить свою программу, чтобы вместо этого читать непосредственно из этих файлов -, которые можно читать как из любых файлов, но создавать двоичные данные, поэтому для ввода символов требуется немного больше работы.

Вот короткий пример Java, взятый из этого вопроса о переполнении стека .

// replace path with path from your system
DataInputStream in = new DataInputStream(
    new FileInputStream("/dev/input/by-id/usb-0430_0005-event-kbd"));
String map = "    abcdefghijlkmnopqrstuvwxyz                                                                                                                                                                                                                                                                ";
// sizeof(struct timeval) = 16
byte[] timeval = new byte[16];
short type, code;
int value;
while (true) {
    in.readFully(timeval);
    type = in.readShort();
    code = in.readShort();
    value = in.readInt();
    System.out.printf("%04x %04x %08x %c\n", type, code, value, 
                                             map.charAt(value>>>24));
}

Преимущество этого метода заключается в подключении к определенной клавиатуре -, поэтому вы можете подключить другую клавиатуру, не мешая работе скрипта. Что может быть полезно для отладки системы. Это также означает, что вам не нужно отключать tty или принудительно использовать определенный tty, чтобы приложение работало. Однако вам по-прежнему необходимо работать с правами root или изменять разрешения устройств, чтобы другой пользователь имел к ним прямой доступ.

1
28.01.2020, 05:17

Вы можете захотеть, чтобы ваша программа запускалась при включении питания.

Как это сделать, зависит от программы init , используемой вашей системой Unix или Linux (, например. некоторые системы используют systemd другие используют некоторые sysvinit)

Если crondзапущен в вашей системе, рассмотрите некоторые @rebootзаписи в вашем crontab (5)

How can I run this java program, that it always restarts itself, and able to read the input from the barcode reader?

Лучше написать достаточно хорошую программу, которая не останавливается невольно. В противном случае оберните его в какой-нибудь сценарий оболочки, который перезапустит его в случае сбоя.

Вам необходимо понять, как устройство чтения штрих-кодов выглядит в Linux. Вероятно, это какое-то символьное устройство, возможно, какое-то tty ... См. tty (4 ), stty (1 ), agetty (] 8 ), termios (3 ), kbd _mode (1)и прочитать Tty демистифицированный .

См. также это

When it runs as a service, it doesn't take any input, and /proc/[procid]/fd/0 always gives permission denied.

Потому что в этом случае стандартный ввод не является ни терминалом (, ни клавиатурой, ни вашим считывателем штрих-кода ). Возможно, вам следует перенаправить его.

Конечно, программы, запущенные при включении питания (через init, systemd, crontab,... )или в пакетном режиме (с помощью at, batchили даже nohup), не имеют та же среда выполнения, что и ваша интерактивная командная строка (разные файловые дескрипторы, разные среда (7).... ). Вы должны либо принять это во внимание при кодировании этих программ, либо закодировать какой-нибудь скрипт-оболочку, хорошо настроив (перенаправление stdin, stdout, stderr;export-некоторые важные переменные)

ПС. Я рекомендую потратить несколько дней, чтобы узнать больше о Linux (, например.Расширенное программирование в Linux ,От включения питания до приглашения Bash ,Введение в Linux ,Понимание и использование systemd,Руководство для начинающих по Bash)и операционные системы (, например Операционные системы :Три простых шага)перед кодированием любой отдельной строки Java или некоторого скрипта.

0
28.01.2020, 05:17

Теги

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