Использование systemd-timesync в файловой системе только для чтения /

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

Как это сделать, зависит от программы 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
25.12.2019, 17:23
3 ответа

После долгих возни, оказалось, что достаточно закомментировать следующие 2 строчки в секции [Unit]:

#CapabilityBoundingSet=CAP_SYS_TIME
#PrivateTmp=yes

Оказывается, это единственные 2 строки, которые требуют комментирования, чтобы все это работало в файловой системе -только для чтения /.

Я не понимаю, почему раскомментирование любой из этих двух строк нарушает работу systemd -timesync с файловой системой только для чтения -. Я бы ожидал, что PrivateTmp=yes создаст приватный tmpfs, смонтированный в приватный /tmp для этого процесса, но, по-видимому, нет. Тогда может быть ошибка в systemd.

0
28.01.2020, 02:59

Это решило мою проблему с DietPi:

  • /run монтируется как tmpfs

  • Создайте программную ссылку для StateDirectory в /var/lib:

    ln -s /run /var/lib/run

  • отключить PrivateTmp

    #PrivateTmp=yes

  • изменение StateDirectory на tmpfs:

    StateDirectory=run/timesync

RuntimeDirectory является абсолютным для /run, который уже является tmpfs, поэтому его не нужно менять

1
28.02.2021, 13:53

У меня сработала только настройка StateDirectory=. Вместо редактирования системных файлов вы можете добавить пару строк, например./etc/systemd/system/systemd-timesyncd.service.d/local-allow-readonly.conf:

[Service]
StateDirectory=

Путь к каталогу/файлу жестко запрограммирован в timesyncd.c , поэтому он не сильно меняется, за исключением того, что User=systemd-timesyncозначает, что systemd -timesyncd не может создать каталог сам. Итак,

  • Если вы сделаете это до первого запуска systemd -timesync (, например. в сценарии начальной настройки )каталог (и файл часов )никогда не будут созданы.
  • Если вы сделаете это после создания каталога, файл часов можно будет обновить, когда файловая система смонтирована для чтения -для записи.

(Если вам интересно, откуда берется ошибка, я предполагаю, что это попытка chmod , которая завершается ошибкой с EROFS, даже если режим уже установлен на желаемый режим. Кажется, это не связано с PrivateTmpи CapabilityBoundingSet.)

0
19.06.2021, 21:44

Теги

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