Запуск демона с GPIO на Pi

Этот синтаксис определенно помогает Вам. Я не понимаю синтаксис, но он работает. Oracle использует этот синтаксис, когда развертывает Менеджер конфигурации Oracle на crontab, следовательно, я полагаю, что это - правильное решение.

0 5 * * * SOME_ENV_VAR=some_value some_command some_parameters
6
31.08.2018, 04:33
1 ответ

Эта оболочка выглядит как сценарий инициализации, но очевидно, что это не так (поэтому вам нужно использовать там sudo ; сценарии, запускаемые init, этого не требуют).

Это кажется очень неуклюжим способом сделать это; оболочка оболочки не служит той цели, которую не могла бы лучше выполнить сама программа python. Избавьтесь от этого; если вам нужен именно сценарий инициализации, напишите минимальный, но я предлагаю вам перенести логику управления демоном из сценария инициализации в сам демон ( UPSalarm.py ).

Поскольку вам нужен только один экземпляр, определите файл pid, который должен использовать процесс. Когда UPSalarm.py start запускается, он проверяет наличие этого файла. Если он не существует, он записывает свой собственный pid в этот файл и продолжает работу. Если он существует, он получает pid, а затем проверяет с ОС, существует ли процесс с pid, и если да, то как он вызывается. Это докажет, что либо UPSalarm.py уже запущен, либо нет. Если это так, выйдите с сообщением «Уже запущено».

Когда запускается UPSalarm.py stop , задействуется аналогичная последовательность - проверьте файл pid, если он существует, проверьте pid, если pid действителен для процесса с именем UPSalarm .py , сигнализировать об остановке, предположительно с помощью SIGINT . UPSalarm.py сам должен реализовать обработчик сигнала для SIGINT , чтобы он удалял файл pid перед выходом.

Я не программист на Python, и это не сайт программирования (см. Stack Overflow ), но я обещаю, что все это легко возможно с Python.

  • Чтобы получить идентификатор текущего процесса, используйте os.getpid () .
  • Чтобы сопоставить идентификатор процесса с именем процесса, прочтите / proc / [pid] / cmdline и выполните поиск строки для UPSalarm.py (или, еще лучше, имя вызываемый процесс, который будет sys.argv [0] , см. здесь ).
  • Для обработки сигналов начните здесь и здесь .
  • Чтобы отправить сигнал другому процессу, используйте os.kill () .

После этого будет легко настроить monit для обработки этого демона. У вас также есть возможность вместо этого просто использовать cron (или ваш собственный сценарий) для вызова UPSalarm.py start через определенные промежутки времени, скажем, каждые 5-10 минут.

6
27.01.2020, 20:28

Теги

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