Как запустить программу C как демон?

Записи меню создаются из .desktop-файлов. Там можно указать, нужно ли значок только показать в Gnome, только в KDE или в обоих с, например, строке OnlyShowIn=KDE.

Для сокрытия всех KDE-приложений Вы могли бы сделать как корень

cd /usr/share/applications/kde4/
for i in *.desktop; do echo “OnlyShowIn=KDE” >> $i; done

Для сокрытия Приложений Gnome в KDE повторите “OnlyShowIn=GNOME” в .desktop-файлы Gnome.

Однако, когда обновление пакета прибывает, это могло переопределить это, таким образом, Вы могли бы для повторения его, например, с заданием крона. Сделайте резервное копирование/usr/share/applications/kde4/прежде, чем сделать это, чтобы быть безопасными, если что-то идет не так, как надо.

Для списка всей информации, которая может быть включена в .desktop-файл, см. http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s05.html

6
12.12.2011, 09:09
3 ответа

Ни один. Если Вы хотите иметь его, ведут себя правильно как настоящий демон, необходимо поместить его с помощью init системы - /etc/init.d (и сделайте соответствующие ссылки runlevel в соответствующем /etc/rc.X папки)

Запустите поиск или взгляните на что-то вроде этого: https://serverfault.com/questions/204695/comprehensive-guide-to-init-d-scripts

7
27.01.2020, 20:27
  • 1
    , согласно ссылке, которые, как это говорит, ищут скелетный файл под/etc/init.d, который я не нахожу под своими песнями? Таким образом, что я должен сделать затем? –  newbie14 12.12.2011, 10:49
  • 2
    только запускает его с/etc/rc.local как это: /path/to/my/binary & например. /usr/local/bin/newbie14program & выполнение его от крона будет также работать: @reboot /usr/local/bin/newbie14program –  Folkert van Heusden 12.12.2011, 11:12
  • 3
    , но согласно thinice это привычка ведет себя хорошо с кроном? Хорошо я хочу учиться далее от Вас относительно/etc/rc.local? Что должно я делать, я должен отредактировать этот файл? Что я должен добавить. Когда я компилирую свой C, я получаю исполняемый файл, как произведено? Таким образом, что я должен сделать затем? А-ч –  newbie14 12.12.2011, 14:46
  • 4
    ... Для начала, Ваш прогон программы C как демон вообще? IE, действительно ли это разветвляется в фон, таким образом, это может продолжать бежать даже после закрытия оболочки? вопрос –  Shadur 12.12.2011, 15:30
  • 5
    @Shadur важен - если это - демон, как Вы говорите, необходимо заглянуть /etc/init.d - ls каталог, должен всегда быть своего рода подобный README файл там для установки init сценария. Если это не демон, то/etc/rc.local / crontab @reboot должен хорошо работать, необходимо будет установить путь в этих файлах в большинстве случаев. –  thinice 12.12.2011, 16:58

Предположение, что Вы пишете сетевому демону, самый легкий путь, должно было бы записать Вашу программу C для взаимодействия через интерфейс к xinetd/inetd и покиньте луг демона xinetd/inetd инструмент.

1
27.01.2020, 20:27
  • 1
    @sybreaon, что этот inetd? как лучше этот xinetd, выдерживают сравнение с daemontool, потому что я, отчасти путают здесь слишком много методов? –  newbie14 20.12.2011, 18:36
  • 2
    daemontools разработан для дополнения чего-то как SysV init для запуска сервисов. inetd является демоном сам и может быть настроен для выполнения внешних приложений, когда что-то соединяется с ним из сети. inetd может быть найден на всех дистрибутивах в то время как daemontools меньше. –  sybreon 21.12.2011, 03:38
  • 3
    @sybereon на самом деле, я - новичок в оба, это оснащает. Да я читал о inetd, больше ссылки к сетевому материалу. Так какое-либо хорошее учебное руководство для меня для запуска моего демона правильно через него? Причина я гуглю и нашел много запутывающих вещей. –  newbie14 21.12.2011, 05:06
  • 4
    Это не хорошее место для подробного руководства. Для Вас могло бы быть лучше задать конкретные вопросы, которые смущают Вас как отдельные вопросы. –  sybreon 21.12.2011, 16:37

Если пользователь хочет написать что-то для прослушивания сетевой службы, которую вы не хотите запускать постоянно, а только по мере необходимости, вам, вероятно, лучше всего запускать ее под inetd/xinetd, связать ее с соответствующим портом. и запустить его таким образом.

Файл init.d, также известный как «службы» в различных разновидностях *NIX, предназначен для запуска программ, предназначенных для работы на разных уровнях выполнения (, например, запуск, завершение работы, одиночный -пользователь., многопользовательская -, с сетью, без, с графическим интерфейсом и т. д. ). Эти службы предназначены для непрерывной работы независимо от того, осуществляется к ним доступ или нет (, например, как база данных ).

Например, база данных будет запущена/остановлена ​​с помощью init.d/services/systemctl, поэтому у нее будут сценарии, которые будут запускать ее при запуске нескольких -пользователей и сети, и у нее будет соответствующий сценарий, который будет выключите его должным образом во время процесса выключения до отключения сети. Эти скрипты помещаются в /etc/init.d/ и связаны с правильным -уровнем запуска (/etc/init.d/rc2.d = runlevel2, rc3.d = runlevel 3 и т. д. ). Вы можете определить различные возможные уровни запуска -, просмотрев файл «/etc/inittab». Вы можете увидеть, на каком уровне запуска вы находитесь, набрав «уровень запуска» или «время безотказной работы» в зависимости от вашего варианта *NIX. База данных будет работать, даже если никто не будет подключен к ней из сети или локально.

Но если у вас есть что-то небольшое, например демон telnet, демон finger, демон whois и т. д.,которые более тесно связаны с поведением ОС, и вы не хотите, чтобы они постоянно находились в памяти, только когда это необходимо, вы можете запускать их в inetd/xinetd. По сути, inetd/xinetd — это «суперсервер», и когда он видит соединение определенного типа на определенном порту, он запускает демон для обработки этого сообщения, а затем повторно -появляется на отдельном порту и, когда все готово, выходит. Таким образом, вы можете создавать сотни, тысячи процессов для обработки соединений на основе доступных системных ресурсов.

Если вы хотите запустить свою программу на языке C как «службу» с уровнем запуска -, вам следует написать свою программу для выполнения ее функции, а затем написать сценарий, который поддерживает аргумент остановки и аргумент остановки.. Затем вы поместите этот скрипт в /etc/init.d/. Затем вы должны сделать символическую ссылку на этот сценарий в соответствующих каталогах уровня запуска -(, например, rc3.d ), и эта символическая ссылка для запуска будет либо начинаться с заглавной буквы «S», что означает, что она активна и должна запускаться во время запуска, за которым сразу следует число, такое как «01», если вы хотите, чтобы оно выполнялось раньше всего на этом уровне выполнения, или «99», если вы хотите, чтобы оно выполнялось последним на этом уровне выполнения -. Причина, по которой это важно, заключается в том, что вы не хотели бы запускать службу, которая зависит от другой службы, такой как DNS, NFS или даже сеть, и они будут недоступны. Вы хотели бы дать ему число ПОСЛЕ того, как эти процессы начнутся. Когда система вызывает ваш скрипт S99domything, она передает слово "start" в качестве аргумента #1, и внутри вашего скрипта у вас должен быть переключатель -case, который при выборе "start" запускает ваш процесс. Если вы хотите отключить свой скрипт, но не удалять его, переименуйте его так, чтобы он начинался со строчной буквы «s» (, например, «s99domything» ).

Аналогичным образом, для упорядоченного завершения вашего процесса вы должны поставить 'K' перед символической ссылкой на скрипт /etc/init.d/domything, такой как K01domything. Сейчас,если вам нужно, чтобы ваш сценарий запускался ПОСЛЕ какого-либо другого процесса, когда вы хотите, чтобы он был закрыт, он, вероятно, должен завершить работу ДО этого другого процесса. Так что, если вы запускаете S99domything, то ваше закрытие вполне может быть K01domything. И когда процесс инициализации находит сценарий, начинающийся с буквы K, он отправляет первый аргумент как «стоп» при вызове сценария. В вашем скрипте должен быть случай «стоп», который правильно отключает вашу службу.

Довольно умно.

Вот почему так важно использовать /sbin/shutdown, потому что он заставляет init пройти надлежащую последовательность запуска/завершения, чтобы все обрабатывалось «упорядоченным» образом, уменьшая потерю или повреждение данных.

Некоторые примеры:

/etc/rc3.d/S25mysql is a symlink to /etc/init.d/mysql.sh
/etc/rc5.d/K01mysql is a symlink to /etc/init.d/mysql.sh

В обоих случаях символические ссылки указывают на один и тот же файл /etc/init.d, но когда процесс инициализации запускает их, он передает «старт» или «стоп» в зависимости от того, был ли первый символ «S» или "К".

Надеюсь, это поможет объяснить несколько вещей, которые согласуются с небольшими вариациями почти во всех версиях *NIX.

В более современных версиях *NIX inetd/xinetd потерял популярность вместо использования systemctl/services. Это позор, потому что он имел свое место, был надежным и простым в использовании. Вы можете увидеть, что все различные порты были назначены на протяжении многих лет, просмотрев /etc/services. Любой порт 1024 или ниже должен обслуживаться корневым процессом -.

Ура! -Д

0
27.01.2020, 20:27

Теги

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