Как сделать процесс сервисом в systemd?

Кажется, моя клавиатура умерла!.

только что установил Windows как двойную загрузку, и он делает то же самое.

поэтому позвольте мне просто закрыть Q

7
10.10.2021, 04:31
2 ответа

Пример пользовательского сервиса — это самый простой способ описать, как это сделать.

Предположим, у вас есть двоичный файл или сценарий с именем mytask, который вы хотите запустить как службу, и он находится в /usr/local/bin/.

Создайте юнит-файл systemdс именем my_example.serviceв вашем домашнем каталоге ~/.config/systemd/user/со следующим содержимым:

[Unit]
Description=[My example task]

[Service]
Type=simple
StandardOutput=journal
ExecStart=/usr/local/bin/mytask

[Install]
WantedBy=default.target

Строка ExecStartявляется наиболее актуальной, так как именно в этой строке вы указываете путь к вашему бинарнику или скрипту, который хотите запустить.

Чтобы ваш сервис запускался автоматически при загрузке, запустите

systemctl --user enable my_example.service

Если вы хотите запустить службу немедленно, без перезагрузки, запустите

systemctl --user start my_example.service

Если вы хотите остановить службу, запустите

systemctl --user stop my_example.service

Чтобы проверить статус службы, запустите

systemctl --user status my_example.service
14
10.10.2021, 06:17

В Linux существует множество способов сделать процесс службой. Как упоминали другие, вы можете использовать systemdдля выполнения процесса и просмотра его вывода, но в зависимости от особенностей вашего языка вы можете использовать старый -школьный метод C 'double fork()' (python и некоторые другие языки тоже имеют это ).

Когда вы fork()в C, вы создаете дочерний процесс. Родительский процесс фактически будет контролировать этот дочерний процесс, но может не ждать его завершения. Если родительский процесс завершится, дочерний процесс будет в буквальном смысле осиротевшим. fork()ing снова означает, чтоinit(процесс 1)принимает ваш новый процесс.

В любом случае, как все это fork()создает демона? Ну, дочерние процессы продолжают работать даже после того, как родительский завершает -, что означает, что он возвращает управление оболочке, которая его выполнила. Базовый пример fork()приведен ниже.

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

void forkexample()
{
  int ret = fork();
  if (ret == 0) {
    fork();
    /*
     * zomg i could run in here forever
     * as a daemon.
     * listen for input, monitor logfiles, whatever.
    */
    printf("I'm the child!\n");
    int x = 0;
    while (x < 10) {
      printf("Still running...\n");
      sleep(1);
      x++;
    }
  }
  else {
    printf("Child process spawned; pid %i\n", ret);
    printf("I'm a parent...\n");
  }
}
int main()
{
  forkexample();
  printf(" and I'm exiting.\n");
  return 0;
}

Результат запуска будет выглядеть следующим образом :tada

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

4
11.10.2021, 04:25

Теги

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