Как мне создать службу для сценария оболочки, чтобы я мог запускать и останавливать ее как демон?

Я использую автовход в систему, не только отключаю пароль ;-)

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

Просто не позволяйте людям вокруг Вас знать, что они могли войти в систему как корень без пароля...

Править

В этом случае Вы выполняете автовход в систему в локальном tty, удаленный вход в систему обычно используют pts (pesudo tty), они не вмешиваются друг друга

22
06.01.2019, 15:39
6 ответов

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

#!/bin/bash

case "$1" in 
start)
   /path/to/hit.sh &
   echo $!>/var/run/hit.pid
   ;;
stop)
   kill `cat /var/run/hit.pid`
   rm /var/run/hit.pid
   ;;
restart)
   $0 stop
   $0 start
   ;;
status)
   if [ -e /var/run/hit.pid ]; then
      echo hit.sh is running, pid=`cat /var/run/hit.pid`
   else
      echo hit.sh is NOT running
      exit 1
   fi
   ;;
*)
   echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

Естественно, сценарий, который вы хотите запустить как службу, должен перейти, например, /usr/local/bin/hit.sh , а приведенный выше код должен находиться в /etc/init.d/hitservice .

Для каждого уровня запуска, на котором должна работать эта служба, вам нужно будет создать соответствующую символическую ссылку. Например, символическая ссылка с именем /etc/init.d/rc5.d/S99hitservice запустит службу для уровня запуска 5. Конечно, вы все равно можете запускать и останавливать ее вручную через service hitservice start / service hitservice stop

30
27.01.2020, 19:42

Вы не можете использовать прокси/туннелирование, так как ssh-key хранится на транзитном сервере и недоступен локально. В идеале вы создаете новый ключ и добавляете его в ~/.ssh/авторизованные ключи _ в DestinationHost , но это может оказаться невозможным.

Самый простой способ установить это - использовать удаленную команду и два локальных порта.

Открыть терминал на DestinationHost:

ssh-t HopHostUser@HopHost «ssh DestinationHost»

Открытый терминал + перенаправление портов от DestinationHost к Localhost:

ssh-t-L8081:localhost:9999 HopHostUser@HopHost «ssh-l9999:localhost:80 DestinationHost»

Вы лучше всего используете вас ssh конфигурация для этого. Она очень длинная.

-121--243246-

Как видно из результатов ls -l внутри устройства, для группы и разрешений «других» флажок «записать» снят. Записывать может только пользователь-владелец.

Если требуется сохранить идентификаторы установки в целости, добавьте соответствующий параметр методов монтирования в /etc/fstab для разрешения записи в группу, например mode = 0775 является rwx для пользователя и группы, r-x для других.

-121--195290-

Я полагаю, что CentOS 7 и выше использует systemd. Если это так для вашей системы, попробуйте следующее:

  1. Поместите команды сценария, которые вы хотите запустить, в /usr/bin/myscript .

  2. Не забудьте сделать сценарий исполняемым с помощью chmod + x .

  3. Создайте следующий файл:

/etc/systemd/system/my.service

[Unit]
Description=My Script

[Service]
Type=forking
ExecStart=/usr/bin/myscript

[Install]
WantedBy=multi-user.target
  1. Перезагрузите все системные служебные файлы: systemctl daemon-reload

  2. Проверьте, что служба запущена с помощью systemctl start my .

Бонус:

Для тестирования службы systemd можно запустить среду tmux с двумя окнами, где верхнее окно отслеживает выход из сценария ( stdout и stderr ) и нижнее окно может использоваться для перезапуска служб. Для этого необходимо установить tmux , затем просто:

tmux new-session \; select-layout even-horizontal \; split-window -v journalctl -o cat --since=@$(date +%s) -f -u my \; rotate-window \; set -g status-bg colour0 \; set -g status-fg colour9 \; attach

Затем перезапустите службу с помощью:

systemctl restart my

Exit tmux с помощью ctrl-d , а затем ctrl-c .

27
27.01.2020, 19:42

Взгляните на fpm. Это инструмент, который создаст для вас сценарии инициализации. Работает на многих платформах (systemd, upstart и т. Д.)

https://github.com/jordansissel/fpm

2
27.01.2020, 19:42

Это мой сценарий как услуга:

[Unit]
Description=To change In test buffer
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/test.sh
TimeoutStartSec=0

[Install]
WantedBy=default.target
3
27.01.2020, 19:42

См. проект Bash Service Manager : https://github.com/reduardo7/bash-service-manager

Пример реализации

#!/usr/bin/env bash

export PID_FILE_PATH="/tmp/my-service.pid"
export LOG_FILE_PATH="/tmp/my-service.log"
export LOG_ERROR_FILE_PATH="/tmp/my-service.error.log"

. ./services.sh

run-script() {
  local action="$1" # Action

  while true; do
    echo "@@@ Running action '${action}'"
    echo foo
    echo bar >&2

    [ "$action" = "run" ] && return 0
    sleep 5
    [ "$action" = "debug" ] && exit 25
  done
}

before-start() {
  local action="$1" # Action

  echo "* Starting with $action"
}

after-finish() {
  local action="$1" # Action
  local serviceExitCode=$2 # Service exit code

  echo "* Finish with $action. Exit code: $serviceExitCode"
}

action="$1"
serviceName="Example Service"

serviceMenu "$action" "$serviceName" run-script "$workDir" before-start after-finish

Пример использования

$ ./example-service
# Actions: [start|stop|restart|status|run|debug|tail(-[log|error])]

$ ./example-service start
# Starting Example Service service...

$ ./example-service status
# Serive Example Service is runnig with PID 5599

$ ./example-service stop
# Stopping Example Service...

$ ./example-service status
# Service Example Service is not running
0
27.01.2020, 19:42

Приведенный ниже блок кода может быть очень полезен для преобразования скриптов linux в службу

  1. Войдите на сервер с root-доступом
  2. Создайте следующий файл модуля systemd для требуемой службы и измените разрешения, как показано ниже
touch /lib/systemd/system/test.service
chmod 664 /lib/systemd/system/test.service
  1. Добавьте следующее содержимое в файл модуля systemd , чтобы определить службу
[Unit]
Description=Test Service
After=network.target
 
[Service]
Type=forking
User=#username
PIDFile=#test.pid_path
ExecStart=#startup_script_path
ExecStop=#shutdown_script_path
 
[Install]
WantedBy=multi-user.target
  1. Включить как службу
systemctl daemon-reload
systemctl enable test.service

  1. Используйте приведенные ниже команды для запуска, остановки, состояния и перезапуска
systemctl start test.service
systemctl stop test.service
systemctl status test.service
systemctl restart test.service
1
20.11.2020, 08:08

Теги

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