Невозможно выполнить ожидаемый сценарий через cron даже с разрешениями, установленными на 777

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

  *   *   *   *   *     /usr/local/sbin/checkForRemoteTasks >/tmp/checkForRemoteTasks.output

Это вызывает скрипт checkForRemoteTasks и экспортирует результаты в /tmp/checkForRemoteTasks.output. Содержание скрипта следующее:

#!/usr/bin/expect -f
set timeout -1
set env(TERM) vt100

if [file exists "/usr/local/sbin/remoteTasks/restartMySQL"] {
    ## STOP APACHE FIRST
    spawn apache2ctl stop
    expect "#"
    spawn service mysql restart
    expect "#"
    spawn rm /usr/local/sbin/remoteTasks/restartMySQL
    expect "#"
    spawn apache2ctl start
    expect "#"
}
if [file exists "/usr/local/sbin/remoteTasks/restartApache"] {
    spawn apache2ctl graceful
    expect "#"
    spawn rm /usr/local/sbin/remoteTasks/restartApache
    expect "#"
}

У меня есть скрипт на моем тестовом сервере, который загружает файл в файл /usr/local/sbin/remoteTasks/restartMySQL. Файл содержит один символ. Сценарий ожидаемого запуска cron (на моем производственном сервере) должен проверить файл restart MySQL, и если он найдет файл, он должен запустить соответствующие команды, чтобы остановить apache, перезапустить MySQL, а затем перезапустить apache. Он работает, когда я запускаю его вручную, а не когда запускаю через cron. Любая помощь будет оценена.

Вот вывод /tmp/checkForRemoteTasks.output:

spawn apache2ctl stop

1 ответ

Решение

Являются ли какие-либо из этих команд на самом деле интерактивными? Если нет, просто используйте exec

if {[file exists "/usr/local/sbin/remoteTasks/restartMySQL"]} {
    ## STOP APACHE FIRST
    exec apache2ctl stop
    exec service mysql restart
    file delete /usr/local/sbin/remoteTasks/restartMySQL
    exec apache2ctl start
}
if {[file exists "/usr/local/sbin/remoteTasks/restartApache"]} {
    exec apache2ctl graceful
    file delete /usr/local/sbin/remoteTasks/restartApache
}

Но если вы делаете это, вы могли бы хорошо придерживаться оболочки:

#!/bin/sh
if [[ -f /usr/local/sbin/remoteTasks/restartMySQL ]]; then
    ## STOP APACHE FIRST
    apache2ctl stop
    service mysql restart
    rm /usr/local/sbin/remoteTasks/restartMySQL
    apache2ctl start
fi
if [[ -f /usr/local/sbin/remoteTasks/restartApache ]]; then
    apache2ctl graceful
    rm /usr/local/sbin/remoteTasks/restartApache
fi
Другие вопросы по тегам