класс признаков, пространство имен и прямое объявление

Как видно из комментариев, проблема заключается в том, что вы не определяете, какую программу следует использовать для выполнения сценария. Учтите, что cronjob выполняется в крошечной среде; там не так много можно предположить. Вот почему мы определяем полные пути и т. Д.

Итак, вам нужно сказать что-то вроде:

1 * * * * /bin/sh /var/www/html/dbsync/dbsync.sh /var/www/html/dbsync
#         ^^^^^^^

/bin/sh, являющегося двоичным файлом, который вы хотите использовать для выполнения сценария.

В противном случае вы можете установить разрешения на выполнение сценария и добавить заголовок shell-script , сообщающий ему, какой интерпретатор использовать:

#!/bin/sh

Если вы сделать это, добавление пути двоичного файла не требуется.

Из Устранение общих проблем с заданиями cron :

Использование относительных путей. Если ваше задание cron выполняет какой-либо скрипт, вы должны обязательно использовать только абсолютные пути внутри этого скрипта. Например, если ваш скрипт находится в /path/to/script.phpand, вы пытаетесь открыть файл с именем file.php в том же каталоге, вы не можете использовать относительный путь, например fopen (file.php). Файл должен быть вызван из его абсолютного пути, например: fopen (/path/to/file.php). Это связано с тем, что задания cron не обязательно запускаются из каталога, в котором находится скрипт, поэтому все пути должны быть вызваны специально.

blockquote>

Кроме того, я понимаю, что вы хотите запустить этот каждую минуту. Если это так, 1 * * * * не будет. Intead, он будет запускать каждые 1 минута каждый час . Поэтому, если вы хотите запускать его каждую минуту, скажите * * * * *.

1
задан Jerry Ma 18 January 2019 в 16:08
поделиться

1 ответ

Вместо использования шаблонов классов для признаков в C ++ 11 вы можете использовать объявления функций (определение не требуется). Функции можно найти, используя поиск имени в зависимости от аргумента , так что вы можете специализировать черты для вашего класса в том же пространстве имен, где объявлен ваш класс.

Это полностью избавляет от необходимости закрывать пространство имен вашего класса, открывать пространство имен признаков, специализировать черту для вашего класса, используя его полное имя, закрывать пространство имен признаков, заново открывать пространство имен вашего учебный класс. А также устраняет необходимость включать объявление основного шаблона.

Пример:

#include <type_traits>

template<class T> struct Type {};

template<class T>
void trait_of(Type<T>); // Generic trait version.

namespace N {
struct A;
int trait_of(Type<A>); // Trait specialisation for A.
} // N

int main() {
    using trait_of_a = decltype(trait_of(Type<N::A>{})); // trait_of is found using ADL.
    static_assert(std::is_same<int, trait_of_a>::value, "");
}

Тип возвращаемого значения функции признака может быть контейнером нескольких типов, например :

template<class T>
void more_traits(Type<T>); // Generic trait version. Must be specialized.

namespace N {
struct MoreTraitsOfA {
    using type_X = ...;
    using type_Y = ...;
};
MoreTraitsOfA more_traits(Type<A>); // Trait specialisation for A.
} // N

using MoreTraits = decltype(more_traits(Type<N::A>{})); 
using type_X = MoreTraits::type_X;
using type_Y = MoreTraits::type_Y;
0
ответ дан Maxim Egorushkin 18 January 2019 в 16:08
поделиться
Другие вопросы по тегам:

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