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

У меня есть задание cron, которое запускается каждые X минут и должно перезапустить службу amazon-ssm-agent. Однако я заметил, что мой ruby-скрипт на самом деле никогда этого не делает.

Вот как выглядит мой crontab:

* * * * * /root/./my_script.rb

Вот очень простое содержимое скрипта ruby:

#!/usr/bin/env ruby
#

command = "service amazon-ssm-agent stop"
system(command)

Если я слежу за /var/log/amazon/ssm/amazon-ssm-agent.log, он никогда не остановится. Если я проверю сервис с помощью service amazon-ssm-agent status, он все еще отображается онлайн.

Каков наилучший способ остановить или перезапустить службу из скрипта ruby, который вызывается заданием Cron? Сегодня я столкнулся с довольно серьезной проблемой, и я думаю, что это причина.

Я попытался зафиксировать результат и записать его в файл, но когда запускается задание cron, файл создается, но он пуст. Вот как теперь выглядит ruby-скрипт:

#!/usr/bin/env ruby

command = "service amazon-ssm-agent stop"
result = system(command)
File.open("/root/result.txt", "w") {|f| f.write(result)}

Я также попытался просто изменить скрипт на это:

#!/usr/bin/env ruby

command = "service amazon-ssm-agent stop"

но все равно не повезло. Я даже только что изменил само задание cron, чтобы запустить службу, а не вызывать скрипт ruby, который запускает службу, но не повезло:

* * * * * service amazon-ssm-agent start

Служба никогда не запускается.

Будет ли работать, если вы замените сценарий Ruby сценарием оболочки?

Stefan 10.12.2020 06:12

Я еще не пробовал, но я в основном пытаюсь включить это в относительно большой скрипт Ruby.

LewlSauce 10.12.2020 06:13

Как узнать, работает ли скрипт Ruby? Если этот скрипт запускается от имени пользователя root, вы должны убедиться, что Ruby находится в PATH корневого каталога. Я предлагаю простой тест, такой как system("date > /tmp/ruby-test.out"), чтобы проверить, работает ли он вообще.

Casper 10.12.2020 06:17

@Casper, в сценарии Ruby есть другие фрагменты кода, которые выполняются до и после этой строки. Почти все работает, за исключением попытки запустить службу в сценарии Ruby, которая вызывается из задания cron.

LewlSauce 10.12.2020 06:20

Каков результат вызова system, то есть его возвращаемое значение?

Stefan 10.12.2020 06:53

Вы не можете использовать `#{command}`?

Sumak 10.12.2020 10:52

Когда я фиксирую результат и записываю его в файл, файл оказывается пустым. Когда я попытался использовать #{command}, это все равно не сработало, хотя файл примера был создан. Это очень странно.

LewlSauce 10.12.2020 15:23
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
7
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Поэтому мне пришлось заменить мою команду service в скрипте Ruby на /usr/sbin/service, и после этого она работала безупречно.

Другие вопросы по теме