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

Я использую CentOS 7 для своей цели – создать cron на каждые пять секунд, но по мере того, как я исследовал, мы можем использовать cron только на минуту, поэтому теперь я создаю файл оболочки.
hit.sh

while sleep 5; do curl http://localhost/test.php; done 

но я ударил его вручную, щелкнув правой кнопкой мыши.

Я хочу создать службу для этого файла, чтобы я мог запускать и останавливать ее автоматически.

Я нашел скрипт для создания службы

 #!/bin/bash # chkconfig: 2345 20 80 # description: Description comes here.... # Source function library. . /etc/init.d/functions start() { # code to start app comes here # example: daemon program_name & } stop() { # code to stop app comes here # example: killproc program_name } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; status) # code to check status of app comes here # example: status program_name ;; *) echo "Usage: $0 {start|stop|status|restart}" esac exit 0 

Но я не знаю, что писать в методах запуска или остановки. Я попытался разместить тот же контент hit.sh в start(){} но он дал ошибку для } в методе остановки.

Я попытался найти его, но не нашел никакой помощи. Я новичок в этом, если кто-то может помочь, это будет большой помощью.

Редактирование: делая то, что сказал Александр, это дало мне

 [root@localhost bin]# systemctl start my Job for my.service failed. See 'systemctl status my.service' and 'journalctl -xn' for details. [root@localhost bin]# systemctl status my.service my.service - My Script Loaded: loaded (/usr/lib/systemd/system/my.service; disabled) Active: failed (Result: exit-code) since Thu 2015-10-15 11:56:25 IST; 20s ago Process: 17880 ExecStart=/usr/bin/myscript (code=exited, status=203/EXEC) Oct 15 11:56:25 localhost.localdomain systemd[1]: my.service: control process exited, code=exited status=203 Oct 15 11:56:25 localhost.localdomain systemd[1]: Failed to start My Script. Oct 15 11:56:25 localhost.localdomain systemd[1]: Unit my.service entered failed state. [root@localhost bin]# journalctl -xn -- Logs begin at Wed 2015-10-14 18:58:37 IST, end at Thu 2015-10-15 11:58:45 IST. -- Oct 15 11:58:45 localhost.localdomain sshd[17911]: @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ Oct 15 11:58:45 localhost.localdomain sshd[17911]: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Oct 15 11:58:45 localhost.localdomain sshd[17911]: Permissions 0626 for '/etc/ssh/ssh_host_ed25519_key' are too open. Oct 15 11:58:45 localhost.localdomain sshd[17911]: It is required that your private key files are NOT accessible by others. Oct 15 11:58:45 localhost.localdomain sshd[17911]: This private key will be ignored. Oct 15 11:58:45 localhost.localdomain sshd[17911]: bad permissions: ignore key: /etc/ssh/ssh_host_ed25519_key Oct 15 11:58:45 localhost.localdomain sshd[17911]: Could not load host key: /etc/ssh/ssh_host_ed25519_key Oct 15 11:58:45 localhost.localdomain sshd[17911]: /var/empty/sshd must be owned by root and not group or world-writable. Oct 15 11:58:45 localhost.localdomain systemd[1]: sshd.service: main process exited, code=exited, status=255/n/a Oct 15 11:58:45 localhost.localdomain systemd[1]: Unit sshd.service entered failed state. 

  • Ubuntu 16.04.1: Почему некоторые программы запускаются как системами systemd, так и initV?
  • SysV запускает скрипт с использованием локальной nvm
  • Как создать службу, которая начинается при запуске?
  • Завершить / пропустить службу SysV во время загрузки
  • Изменение уровня запуска из chroot
  • Я больше не вижу вывод rc-скриптов
  • Как назвать и где разместить сценарий выскочки?
  • Портирование старых привычек sysvinit на systemd
  • 5 Solutions collect form web for “Как создать службу для сценария оболочки, чтобы я мог начать и остановить ее, как демон?”

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

     #!/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

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

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

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

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

    /usr/lib/systemd/system/my.service

     [Unit] Description=My Script [Service] Type=forking ExecStart=/usr/bin/myscript [Install] WantedBy=multi-user.target 
    1. Перезагрузите служебные файлы systemd: systemctl daemon-reload

    2. Убедитесь, что он работает с systemctl start my

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

    https://github.com/jordansissel/fpm

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

     [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 того, как [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 

    См. Проект 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 
    Linux и Unix - лучшая ОС в мире.