Вы можете захотеть, чтобы ваша программа запускалась при включении питания.
Как это сделать, зависит от программы 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 или некоторого скрипта.
После долгих возни, оказалось, что достаточно закомментировать следующие 2 строчки в секции [Unit]:
#CapabilityBoundingSet=CAP_SYS_TIME
#PrivateTmp=yes
Оказывается, это единственные 2 строки, которые требуют комментирования, чтобы все это работало в файловой системе -только для чтения /.
Я не понимаю, почему раскомментирование любой из этих двух строк нарушает работу systemd -timesync с файловой системой только для чтения -. Я бы ожидал, что PrivateTmp=yes создаст приватный tmpfs, смонтированный в приватный /tmp для этого процесса, но, по-видимому, нет. Тогда может быть ошибка в systemd.
Это решило мою проблему с DietPi:
/run монтируется как tmpfs
Создайте программную ссылку для StateDirectory в /var/lib:
ln -s /run /var/lib/run
отключить PrivateTmp
#PrivateTmp=yes
изменение StateDirectory на tmpfs:
StateDirectory=run/timesync
RuntimeDirectory является абсолютным для /run, который уже является tmpfs, поэтому его не нужно менять
У меня сработала только настройка StateDirectory=
. Вместо редактирования системных файлов вы можете добавить пару строк, например./etc/systemd/system/systemd-timesyncd.service.d/local-allow-readonly.conf
:
[Service]
StateDirectory=
Путь к каталогу/файлу жестко запрограммирован в timesyncd.c , поэтому он не сильно меняется, за исключением того, что User=systemd-timesync
означает, что systemd -timesyncd не может создать каталог сам. Итак,
(Если вам интересно, откуда берется ошибка, я предполагаю, что это попытка chmod , которая завершается ошибкой с EROFS, даже если режим уже установлен на желаемый режим. Кажется, это не связано с PrivateTmp
и CapabilityBoundingSet
.)