Intereting Posts
Есть ли способ заставить Arch работать полностью после удаления домашнего раздела? Какое программное обеспечение отвечает за проверку прав доступа к файлам для пользователей или нет? Как рассчитать правильный размер образа файловой системы loopback для debootstrap Linux Mint 17.1 включает GNOME? Мышь левой кнопкой мыши перестает работать Создание обходного интерфейса GUI беспроводной сети Абсолютный контроль трекпада от относительного отслеживания Является ли 32bit еще предпочтительнее 64 бит? Обычно скрипт работает, но не с cron Как заменить путь в поле поиска с помощью VIM Systemd: остановить службу до приостановки, перезапустить после возобновления Есть ли опасность использовать переменную unset в определении функции bash? Клавиши макета клавиатуры не поддерживаются на debian Можно ли создать с FFMPEG серию изображений с непрерывной короткой продолжительностью? Почему использование служебной команды работает в системном дистрибутиве?

Создание сценария systemd для Sybase ASE

Я пытаюсь настроить нашу установку Sybase для запуска под systemd.

Основные команды описаны здесь, но когда мы управляем им вручную, мы запускаем его с помощью следующей команды (запуск сервера запуска после запуска скриптов RUN_SYBASE)

su - sybase cd sqlserver/install startserver -f RUN_SYBASE_localhost_back startserver -f RUN_SYBASE_localhost 

Мы можем видеть детали запущенных процессов

 [sybase@localhost install]$ showserver FS UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD 0 S sybase 14072 14068 7 80 0 - 157888 futex_ 18:41 ? 00:11:26 /opt/sap/ASE-16_0/bin/dataserver -d/opt/sap/data/master.dat -e/opt/sap/ASE-16_0/install/SYBASE_localhost.log -c/opt/sap/ASE-16_0/SYBASE_localhost.cfg -M/opt/sap/ASE-16_0 -N/opt/sap/ASE-16_0/sysam/SYBASE_localhost.properties -i/opt/sap -sSYBASE_localhost 0 S sybase 14066 14063 0 80 0 - 6521 poll_s 18:41 ? 00:00:00 /opt/sap/ASE-16_0/bin/backupserver -e/opt/sap/ASE-16_0/install/SYBASE_localhost_back.log -N25 -C20 -I/opt/sap/interfaces -M/opt/sap/ASE-16_0/bin/sybmultbuf -SSYBASE_localhost_back 

И чтобы закрыть sybase down, нам нужно выполнить команду в самой sybase

 [sybase@localhost ~]$ isql -Usa -Ppassword -SSYBASE_localhost << EOF_INPUT shutdown SYB_BACKUP with nowait go shutdown go EOF_INPUT Backup Server: 3.48.1.1: The Backup Server will go down immediately. Terminating sessions. Server SHUTDOWN by request. ASE is terminating this process. CT-LIBRARY error: ct_results(): network packet layer: internal net library error: Net-Library operation terminated due to disconnect [sybase@localhost ~]$ echo $? # yes the error was expected 0 

Это то, что у меня есть для скрипта до сих пор, su и source ~/SYBASE.sh – это потому, что это используется bashrc, но systemd не запускает bashrc . Команда / opt / sap / stop_sybase_command – это просто многострочная строка, введенная в sybase для завершения работы сервера.

 [Unit] Description=Sybase ASE Server 16.0 [Service] ExecStart=/bin/su sybase -c "source ~/SYBASE.sh; /opt/sap/ASE-16_0/bin/startserver -f /opt/sap/sqlserver/install/RUN_SYBASE_localhost_back; /opt/sap/ASE-16_0/bin/startserver -f /opt/sap/sqlserver/install/RUN_SYBASE_localhost" ExecStop=/bin/su sybase -c "source ~/SYBASE.sh; /opt/sap/client/bin/isql -Usa -Ppassword -SSYBASE_localhost < /opt/sap/stop_sybase_command" WorkingDirectory=/opt/sap/ASE-16_0/install/ [Install] WantedBy=multi-user.target 

Использование systemctl start sybase.service выполняется в порядке и создает сервер, но в конечном итоге утверждается, что он сбой, я считаю, потому что команды starterver выходят после запуска sybase

 Active: failed (Result: exit-code) since Tue 2015-08-25 21:52:43 EDT; 11s ago 

Я попытался использовать Type=forking вместо этого, но это заставило его думать, что он потерпел неудачу даже раньше.

 [root@localhost ~]# systemctl start sybase.service Job for sybase.service failed. See 'systemctl status sybase.service' and 'journalctl -xn' for details. 

Но в любом случае он запускается, но остановка не работает вообще, если я пытаюсь остановить команду как root, она отлично работает

 [root@localhost ~]# /bin/su sybase -c "source ~/SYBASE.sh; /opt/sap/client/bin/isql -Usa -Ppassword -SSYBASE_localhost < /opt/sap/stop_sybase_command" Backup Server: 3.48.1.1: The Backup Server will go down immediately. Terminating sessions. Server SHUTDOWN by request. ASE is terminating this process. CT-LIBRARY error: ct_results(): network packet layer: internal net library error: Net-Library operation terminated due to disconnect [root@localhost ~]# 

Но когда я пытаюсь прекратить использование systemctl, все, что я вижу в статусной части журнала, – это команда, которая, по-видимому, не работает

  Process: 20961 ExecStop=/bin/sh -c /bin/su sybase -c "source ~/SYBASE.sh; /opt/sap/client/bin/isql -Usa -Ppassword -SSYBASE_localhost < /opt/sap/stop_sybase_command" (code=exited, status=255) 

А что касается самого журнала, единственной вещью, напечатанной в ответ на команду остановки, является следующее

 Aug 25 21:59:48 localhost.localdomain systemd[1]: Stopped Sybase ASE Server 16.0. 

Я пытаюсь исправить три проблемы с этим скриптом.

  1. Выпустите команду запуска без systemd, думая, что это не удалось
  2. Выдать команду остановки, которая фактически останавливает sybase
  3. Имейте статус, дайте отзыв о том, showserver ли процессы, показанные showserver

Спасибо

ОБНОВЛЕНИЕ: Следуя советам meuh, я пошел со следующим сценарием, который, кажется, делает то, что мне нужно

 [Unit] Description=Sybase ASE Server 16.0 [Service] # Systemd executes a single command with su -c which ignores the bashrc setting our environment, instead su to sybase and run the SYBASE.sh directly # Could strictly be two services but we'll be lazy and just do one. After starting the backup and main server we find the pid of the main server and drop it into a PID file ExecStart=/bin/su sybase -c "source ~/SYBASE.sh; /opt/sap/ASE-16_0/bin/startserver -f /opt/sap/sqlserver/install/RUN_SYBASE_localhost_back; /opt/sap/ASE-16_0/bin/startserver -f /opt/sap/sqlserver/install/RUN_SYBASE_localhost; showserver | sed '2q;d'| awk '{ print $4 }' > /opt/sap/sqlserver/install/sybase.pid" # Shutting down we actually have to issue the command from inside sybase ExecStop=/bin/sh -c '/bin/su sybase -c "source ~/SYBASE.sh; /opt/sap/client/bin/isql -Usa -Ppassword -SSYBASE_localhost < /opt/sap/stop_sybase_command"' # The startserver commands exits so we need to track the fork, listed in sybase.pid Type=forking PIDFile=/opt/sap/sqlserver/install/sybase.pid WorkingDirectory=/opt/sap/ASE-16_0/install/ [Install] WantedBy=multi-user.target 

Отвечая на вопрос mueh, процесс, кажется, включен в контрольную группу, но когда я вручную убиваю его, процесс просто удаляется.

 [root@localhost ~]# systemctl status sybase.service |head -7 sybase.service - Sybase ASE Server 16.0 Loaded: loaded (/etc/systemd/system/sybase.service; enabled) Active: active (running) since Wed 2015-09-02 02:41:40 EDT; 23s ago Process: 23384 ExecStop=/bin/sh -c /bin/su sybase -c "source ~/SYBASE.sh; /opt/sap/client/bin/isql -Usa -Pscadacom -SSYBASE_localhost < /opt/sap/stop_sybase_command" (code=exited, status=255) Main PID: 23431 (backupserver) CGroup: /system.slice/sybase.service     23431 /opt/sap/ASE-16_0/bin/backupserver -e/opt/sap/ASE-16_0/install/SYBASE_localhost_back.log -N25 -C20 -I/opt/sap/interfaces -M/opt/sap/ASE-16_0/bin/sybmultbuf -SSYBASE_localhost_back [root@localhost ~]# kill 23431 [root@localhost ~]# systemctl status sybase.service |head -7 sybase.service - Sybase ASE Server 16.0 Loaded: loaded (/etc/systemd/system/sybase.service; enabled) Active: active (running) since Wed 2015-09-02 02:41:40 EDT; 1min 56s ago Process: 23384 ExecStop=/bin/sh -c /bin/su sybase -c "source ~/SYBASE.sh; /opt/sap/client/bin/isql -Usa -Pscadacom -SSYBASE_localhost < /opt/sap/stop_sybase_command" (code=exited, status=255) Main PID: 23431 CGroup: /system.slice/sybase.service [root@localhost ~]# 

Да, и я не уверен, что из персонажей, это просто какая-то странная вещь, которая всплывает повсюду, когда я ssh'd в VM (я предполагаю, что это безобидная кодировка)

Попробуйте добавить в [Service] запись PIDFile= с именем файла, в который вы должны поместить идентификатор процесса вашего dataserver. Отредактируйте строку ExecStart чтобы получить этот pid каким-то образом, например, из команды showserver . Такой файл уже может быть создан Sybase. Вероятно, вам нужно снова использовать Type=forking .

Убедитесь, что код выхода из сценариев Exec равен 0, если они работают, но systemd говорит, что нет, например, добавив exit 0 в конец.


Возможно, ваш процесс каким-то образом покидает контрольную группу. В качестве службы тестирования я использовал следующее: в /etc/systemd/system/myscript.service

 [Unit] Description=Try Forking using PIDFile After=syslog.target [Service] Type=Forking PIDFile=/tmp/mypid ExecStart=/bin/bash -c '( (nohup sleep 99999 & echo $! >/tmp/mypid )& sleep 5 )' ExecStop=/bin/bash -c 'kill -1 $(</tmp/mypid); >/tmp/mypid; exit 0' [Install] WantedBy=multi-user.target того, как [Unit] Description=Try Forking using PIDFile After=syslog.target [Service] Type=Forking PIDFile=/tmp/mypid ExecStart=/bin/bash -c '( (nohup sleep 99999 & echo $! >/tmp/mypid )& sleep 5 )' ExecStop=/bin/bash -c 'kill -1 $(</tmp/mypid); >/tmp/mypid; exit 0' [Install] WantedBy=multi-user.target 

Я начал с

 $ sudo systemctl daemon-reload $ sudo systemctl enable myscript $ sudo systemctl start myscript $ sudo systemctl status myscript;echo $? Loaded: loaded (/etc/systemd/system/myscript.service; enabled) Active: active (running) since 09:01:33 CEST; 2s ago Main PID: 25485 (bash) CGroup: /system.slice/myscript.service |-25485 /bin/bash -c ( (nohup sleep 99999 & echo $! >/tmp/mypid )&... |-25486 /bin/bash -c ( (nohup sleep 99999 & echo $! >/tmp/mypid )&... |-25488 sleep 5 `-25489 sleep 99999 

Через 5 секунд статус показывает только время сна. Его pid находится в /tmp/mypid .

 $ sudo systemctl status myscript;echo $? Active: active (running) since 09:01:33 CEST; 11s ago Main PID: 25489 (sleep) CGroup: /system.slice/myscript.service `-25489 sleep 99999 

Стоп работает, как показывает статус:

 $ sudo systemctl stop myscript;echo $? 0 $ sudo systemctl status myscript;echo $? Active: inactive (dead) since 09:01:55 CEST; 4s ago Process: 25504 ExecStop=/bin/bash -c kill ... Process: 25489 ExecStart=/bin/bash -c ( (nohup sleep ... Main PID: 25489 (code=killed, signal=TERM) 3 

Начиная снова и убивая сон вручную, система немедленно замечает процесс смерти и запускает ExecStop и удаляет файл /tmp/mypid без необходимости остановки:

 $ sudo systemctl start myscript $ sudo kill -15 $(</tmp/mypid) # pid 25529 $ ps -p $(</tmp/mypid) bash: /tmp/mypid: No such file or directory $ sudo systemctl status myscript;echo $? Active: inactive (dead) since 09:03:53 CEST; 9s ago Process: 25568 ExecStop=/bin/bash -c kill Process: 25529 ExecStart=/bin/bash -c ( (nohup sleep Main PID: 25529 (code=killed, signal=TERM) 09:02:38 systemd[1]: Started Try Forking using PIDFile. 09:03:53 bash[25568]: /bin/bash: line 0: kill: (25529) - No suc...ss 3 $ sudo systemctl disable myscript;echo $? 

Это то, что я сделал. Не требуется файл forking или pid и может запускаться как пользователь sybase. ExecStop не требуется, если вы довольны тем, что dataserver остановлен командой kill.

файл блока … / etc / systemd / system / sybase-srvnane

Добавьте отдельный файл блока для каждого сервера sybase.

 [Ед. изм]
 Описание = Sybase dataserver

 [Обслуживание]
 Пользователь = Sybase
 ExecStart = / home / sybase / bin / run-dataserver SRVNAME
 ExecStop = / home / sybase / bin / stop-dataserver SRVNAME

 [Установить]
 WantedBy = multi-user.target

запустить скрипт … / home / sybase / bin / run-dataserver

 #! / Bin / ш

 [$ # -ne 1] && echo "Использование: $ 0 <SYB_SERVER>" && exit 1
 _SERVER = $ {1}
 ,  /opt/sybase/SYBASE.sh
 _run_file = $ {SYBROOT} / $ {SYBASE_ASE} / установить / RUN _ $ {_} сервера
 если [-x $ {_ run_file}]
 тогда
         echo "Запуск сервера Sybase ... $ {_ server}"
         ,  $ {_} Run_file
 еще
         echo "Не удается найти файл запуска $ {_ run_server}"
         выход 1
 фи

stop script … / home / sybase / bin / stop-dataserver

 #! / Bin / Баш

 [$ # -ne 1] && echo "Использование: $ 0 <SYB_SERVER>" && exit 1
 _SERVER = $ {1}
 ,  /opt/sybase/SYBASE.sh
 _isql = $ {SYBROOT} / $ {SYBASE_OCS} / bin / ISQL
 если [-x $ {_ isql}]
 тогда
         echo "Остановка сервера Sybase .... $ {_ server}"
         $ {_ isql} -U sa -S $ {_ server} << EOF
 $ (cat /home/sybase/.sa_password)
 неисправность
 идти
 EOF

 фи

Для полноты у меня также есть остановка для резервного сервера … / home / sybase / bin / start-backup-dataserver

 #! / Bin / Баш

 [$ # -ne 1] && echo "Использование: $ 0 <SYB_SERVER>" && exit 1
 _SERVER = $ {1}
 ,  /opt/sybase/SYBASE.sh
 _isql = $ {SYBROOT} / $ {SYBASE_OCS} / bin / ISQL
 если [-x $ {_ isql}]
 тогда
         echo "Остановка сервера резервного копирования Sybase .... $ {_ server}"
         $ {_ isql} -U sa -S $ {_ server} << EOF
 $ (cat /home/sybase/.sa_password)
 выключение SYB_BACKUP
 идти
 EOF

 фи

У меня есть пользовательский файл только для чтения /home/sybase/.sa_password для пароля.

sudo systemctl daemon-reload и все готово.

Вместо использования su для пользователя вы можете использовать User= key для установки пользователя в файл блока