LINUX.ORG.RU

Сообщения aido

 

Упражнения по регулярным выражениям

Доброго времени суток!

Сел на НГ-каникулах изучать Perl и дошел счас до регулярок. Очень уж они понравились, так что хочется, чтобы они получше запомнились. Из чего 2 вопроса:

1) Встречал кто-нибудь набор тестов по регуляркам, да побольше?

2) Регулярки SEd, Perl, awk и остальных языков сильно между собой по синтаксису отличаются? Здесь тупо лень гуглить, но если память мне не изменяет, у SEd там был какой-то дополнительный изврат с заменами строк и еще набором дополнительных возможностей (или перл тоже так умеет?).

 , ,

aido
()

Как пишут безопасные проги?

Доброго времени суток!

Господа, а как пишутся безопасные проги? В смысле: с одной стороны, есть всякие техники типа управления памятью, права доступа и пр., но с другой-то стороны - находят же ж как-то уязвимости нулевого дня.

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

Или еще иначе можно спросить - как находят уязвимости нулевого дня? Наверное, извращенным должно быть мышление тестера.

 ,

aido
()

Кортежи Boost. Каждому рабочему классу свой тред!

Доброго времени суток!

Есть набор классов, экземпляр каждого класса должен создаваться в своем потоке. Было решено сделать это кортежами и сейчас я не догоняю, как поправить свой код (функцию RunThreads)...

template<class... Childrens> class TChild
{
    private:
        boost::tuple<Childrens*...> tupChild;
        boost::thread* all_childs[sizeof...(Childrens)];
        void RunThreads();
        void StopThreads();
    public:
        ....
}
template<class... Childrens> 
void TChild<Childrens...>::RunThreads()
{
    for(uint8_t i=0; i<sizeof...(Childrens);++i)
    {
        all_childs[i]=new boost::thread(
                                    [this, i](){
                                        tupChild.get<i>()=new *(boost::tuples::element<i,tupChild>::type);
                                        });
    }
}

error: expected expression
                                        tupChild.get<i>()=new *(boost::tuples::element<i,tupChild>::type);
                                                        ^
error: expected a type
                                        tupChild.get<i>()=new *(boost::tuples::element<i,tupChild>::type);
                                                              ^

 ,

aido
()

Включить DDR в Standalone.

Доброго времени суток!

Восполняю пробелы в знаниях и сейчас интересует такой нескромный извращенный вопрос: а как без ОС пользоваться напрямую DDR-памятью?

Ее ж как-то надо инициализировать, определить размер, научиться туда писать и оттуда читать. Кстати, вопрос по чтению/записи - размер DDR может доходить до 16 Гб, если верить википедии, это значит, что все адреса в ней не уложатся в 32-байтный тип int, либо есть какое-то разбиение на ячейки (если верить К. Касперски и мне не изменяет память, то по 8 байт). Также еще надо где-то держать адреса других устройств в периферии... Ну, вопросов много, поэтому спрошу общими словами: где можно быстро и конкретно прочитать, как работать с DDR3? Желательно с исходниками кода и комментариями, откуда взялись все те переменные, что там используются (те исходники, что я видел - были адскими для понимания).

 ,

aido
()

boost signal handling

Доброго времени суток!

Встала задача асинхронной обработки сигналов приложением при помощи Boost.Asio, при этом не надо, чтобы приложение сразу выходило после обработки первого сигнала, а дальше ждало новых сигналов. В документации написано, что метод run() класса boost::asio::io_service не должен вызываться из обработчика сигналов (точнее, до того, как сигнал будет обработан), но это ок, также там написано, что для таких целей существует метод reset, который должен вызываться перед каждым последующим вызовом run(). Поясните, почему этот код не робит и как его поправить? Вроде все согласно документации...

io_service_.run();
for(;;)
{
   io_service_.reset();
   io_service_.run();
}

 ,

aido
()

2D -> 3D

Доброго времени суток!

Ребят, есть какой-нить открытый продукт для преобразования набора кадров/видео в 3D-модель? что-то навроде прошивок 3D-сканеров.

 ,

aido
()

Xilinx Vivado

У меня одного этот продукт вызывает дикую боль в месте крепления ног к спине??

Как в дизайн добавлять нестандартные простые блоки (это ж не IP) типа инверторов, усилителей и прочей математики?

Форум Xilinx молчит как партизан.

 

aido
()

Как из видеофайла вытащить побайтово видеопоток и записать его в файл?

Доброго времени суток!

Есть видео в неком формате, например .avi или .mp4, нужно из него получить полностью разжатый видеопоток даже без разделения на кадры, то есть тупо поток байтов.

Вопрос: как? пробовал ffmpeg, но там raw-формат означает формат фирмы panasonic.

 

aido
()

Неправильная отрисовка окон/загрузка драйверов Lubuntu

Доброго времени суток!

После очередной перезагрузки все окна начали как-то очень медленно отрисовываться: сверху вниз строка за строкой. В логах иксов и опенбокса ничего не нашлось интересного. Также отпали все usb-устройства. dmesg устройства видит, но в /dev они не появляются. Перед этим ставил libftdi1, libftdipp1, игрался с дровами под определенной usb-устройство.

В lsmod раньше была целая куча модулей, сейчас только:

$ lsmod
Module                  Size  Used by
hid_generic            16384  0 
usbhid                 53248  0 
hid                   110592  2 hid_generic,usbhid
psmouse               118784  0 
ahci                   36864  6 
r8169                  81920  0 
libahci                32768  1 ahci
mii                    16384  1 r8169
sdhci_acpi             16384  0 
sdhci                  45056  1 sdhci_acpi

Как это исправляется?

 ,

aido
()

список всех программ с версиями

Всем привет!

Как в линуксе вывести список всех программ (именно программ, а не пакетов) с их версиями? сам список программ выводится просто ls /bin && ls /usr/bin, а вот чтобы версии добавить... либо есть готовая команда, либо придется парсить выводы prog --help или prog --version или prog -V и много других вариантов...

 

aido
()

Как запустить Hello World на ZYNQ 706C?

Доброго времени суток!

Дали поиграться с вышеописанной платкой, ну и для начала надо бы запустить че-нибудь простое, навроде хеллоуворлда. Вроде стандартный Example Design в Vivado создается и даже плата прошивается (Program FPGA Complete), но отклика в XMD-терминале я не вижу. Что я делаю не так и как делать правильно, чтобы увидеть желанную строчку отклика от платы? Или к чему там в SDK-терминале подключаться? При прописывании строки вида «COM1», «USB0», «12345» говорит, что по этим портам ничего не найдено.

Пользовался мануалами частично отсюда (дизайн создавал через vivado, а не edk, а все остальное по мануалу), отсюда и стандартной справкой Welcome в SDK.

 ,

aido
()

Не работает звук Lubuntu 14.04

Доброго времени суток!

Собственно, сабж:

$ cat /proc/asound/cards
 0 [HDMI           ]: HDA-Intel - HDA Intel HDMI
                      HDA Intel HDMI at 0xf7d14000 irq 33
 1 [PCH            ]: HDA-Intel - HDA Intel PCH
                      HDA Intel PCH at 0xf7d10000 irq 34

$ cat ~/.asoundrc
cat: /home/user/.asoundrc: Нет такого файла или каталога

$ aplay -l
**** Список PLAYBACK устройств ****
карта 0: HDMI [HDA Intel HDMI], устройство 3: HDMI 0 [HDMI 0]
  Подустройства: 1/1
  Подустройство №0: subdevice #0
карта 0: HDMI [HDA Intel HDMI], устройство 7: HDMI 1 [HDMI 1]
  Подустройства: 1/1
  Подустройство №0: subdevice #0
карта 0: HDMI [HDA Intel HDMI], устройство 8: HDMI 2 [HDMI 2]
  Подустройства: 1/1
  Подустройство №0: subdevice #0
карта 1: PCH [HDA Intel PCH], устройство 0: ALC887-VD Analog [ALC887-VD Analog]
  Подустройства: 1/1
  Подустройство №0: subdevice #0

$ aplay /usr/share/sounds/alsa/Front_Center.wav
ALSA lib pcm_dmix.c:1022:(snd_pcm_dmix_open) unable to open slave
aplay: main:722: ошибка открытия аудио-устройства: Нет такого файла или каталога

Почему алса может не видеть устройства и не конфигурироваться?

 ,

aido
()

Lubuntu 14.04. упала сеть

Доброго времени суток!

Собственно, сначала логи:

lspci
........
08:00.0 Network controller: Broadcom Corporation BCM43142 802.11b/g/n (rev 01)

dmesg
...
[ 1703.693639] wl: module license 'MIXED/Proprietary' taints kernel.
[ 1703.693644] Disabling lock debugging due to kernel taint

ifconfig wlan0 up
wlan0: ОШИБКА при получении флагов интерфейса: Нет такого устройства

Что было:

внезапно вчера вечером после очередного из обновлений упала сеть. В ходе разбирательств оказалось, что драйвер на wifi-карточку больше не работает. Решил полностью пересобрать ядро и перейти на 4.3, в ядре этого драйвера не нашел (может, плохо искал). Решил скачать его с оф. сайта и собрать, но тоже не заработало (вывод dmesg выше).

Вопрос: Че делать?

 ,

aido
()

Запуск приложения на определенном рабочем столе

Доброго времени суток!

Я понимаю, что сабж уже не раз обсуждался на просторах инета, но как-то не нагуглилось...

Как сделать запуск приложения на определенном виртуальном рабочем столе, не используя devilspie? Можно ли использовать для этой цели какой-нибудь i3wm, чтобы только стандартными его средствами это осуществить?

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

 

aido
()

Библиотеки Linux/Win

Доброго времени суток!

Рассуждали с товарищем на днях о сходствах и различиях библиотек в Linux (use gcc)/Windows (use MSVS).

Основным предметом спора было различие функций LoadLibraryA/W и dlopen, и утверждение, что LoadLibrary, якобы быстрее грузит функции из библиотеки (в отличие от классического метода линковки), потому, что загружает из нее не все функции, а только нужные. Также встал вопрос, зачем под виндами нужен костыль в виде прописывания в .def файле имен используемых функций из библиотеки? Хз, насколько это правда (поверил другу наслово), но он аргументировал создание такого списка тем, что так проще всего сказать компилятору, какие функции можно будет экспортировать из библиотеки. С другой стороны, в никсах достаточно добавить слово extern к функции, чтобы сделать ее видимой из библиотеки и никакие списки не нужны...

P.S. Вероятно, здесь написано много бреда, посему прошу расставить все по полочкам человеку, наглухо забывшему винду и другому человеку, не знающему совсем никсов.

Если кратко, то список вопросов таков:

1) В чем отличие функций LoadLibrary+GetProcAddress от аналогичной dlopen+dlsym, кроме названия?

2) Как они загружают функции из библиотеки - действительно ли только необходимые функции, в чем я сильно сомневаюсь, или же сначала подгружают целиком файл библиотеки в память, а только потом ищут нужные функции?

3) .def-файлы под MSVS - это что за костыль и почему не понравился мелкомягким способ через extern?

 

aido
()

C/C++ vprintf

Доброго времени суток!

Положим, у нас есть примерно такой код

const char* format="%i \% %s %c %x";
vprintf(format,a,b,c,d);

Каким образом можно программно определить из format, сколько параметров было передано? Что-нить стандартное есть или придется руками каждый раз считать в строчке количество '%'?

 

aido
()

boost.log фильтры сообщений

Доброго времени суток!

Есть задача: писать каждый тип сообщений (предупреждения, ошибки, инфо и дебаг) каждый в свой файл.

в общем, на такой код

enum severity_level
{
    debug,
    info,
    warning,
    error,
    nolog
};

void TLogger::AddFileLog(severity_level level, const std::string & fname)
{
    namespace keywords = boost::log::keywords;

    boost::log::add_file_log
    (
        keywords::file_name = fname,                /*< file name pattern >*/
        keywords::rotation_size = sizelog,          /*< rotate files every 10 MiB... >*/
        keywords::format = "[%TimeStamp%]: %Message%",/*< log record format >*/
        keywords::filter=[&]()->bool{return level==loglevel;}
    );
}
Выдаются такие ошибки:
In file included from /usr/include/boost/log/utility/setup/file.hpp:28:0,
                 from logger.cpp:23:
/usr/include/boost/log/detail/sink_init_helpers.hpp: In instantiation of ‘void boost::log::v2s_mt_posix::aux::setup_filter(SinkT&, const ArgsT&, mpl_::false_) [with SinkT = boost::log::v2s_mt_posix::sinks::synchronous_sink<boost::log::v2s_mt_posix::sinks::text_file_backend>; ArgsT = boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::filter, const TLogger::AddFileLog(severity_level, const string&)::<lambda()> >, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::format, const char [25]>, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::file_name, const std::basic_string<char> >, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::rotation_size, int>, boost::parameter::aux::empty_arg_list> > > >; mpl_::false_ = mpl_::bool_<false>]’:
/usr/include/boost/log/utility/setup/file.hpp:89:108:   required from ‘boost::shared_ptr<boost::log::v2s_mt_posix::sinks::synchronous_sink<boost::log::v2s_mt_posix::sinks::text_file_backend> > boost::log::v2s_mt_posix::aux::add_file_log(const ArgsT&) [with ArgsT = boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::filter, const TLogger::AddFileLog(severity_level, const string&)::<lambda()> >, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::format, const char [25]>, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::file_name, const std::basic_string<char> >, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::rotation_size, int>, boost::parameter::aux::empty_arg_list> > > >]’
/usr/include/boost/log/utility/setup/file.hpp:127:1:   required from ‘boost::shared_ptr<boost::log::v2s_mt_posix::sinks::synchronous_sink<boost::log::v2s_mt_posix::sinks::text_file_backend> > boost::log::v2s_mt_posix::add_file_log(const T0&, const T1&, const T2&, const T3&) [with T0 = boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::file_name, const std::basic_string<char> >; T1 = boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::rotation_size, int>; T2 = boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::format, const char [25]>; T3 = boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::filter, const TLogger::AddFileLog(severity_level, const string&)::<lambda()> >]’
logger.cpp:37:5:   required from here
/usr/include/boost/log/detail/sink_init_helpers.hpp:74:60: error: no matching function for call to ‘acquire_filter(const TLogger::AddFileLog(severity_level, const string&)::<lambda()>&)’
     s.set_filter(aux::acquire_filter(args[keywords::filter]));
                                                            ^
/usr/include/boost/log/detail/sink_init_helpers.hpp:74:60: note: candidates are:
/usr/include/boost/log/detail/sink_init_helpers.hpp:47:15: note: template<class CharT> boost::log::v2s_mt_posix::filter boost::log::v2s_mt_posix::aux::acquire_filter(const CharT*)
 inline filter acquire_filter(const CharT* filter)
               ^
/usr/include/boost/log/detail/sink_init_helpers.hpp:47:15: note:   template argument deduction/substitution failed:
/usr/include/boost/log/detail/sink_init_helpers.hpp:74:60: note:   mismatched types ‘const CharT*’ and ‘TLogger::AddFileLog(severity_level, const string&)::<lambda()>’
     s.set_filter(aux::acquire_filter(args[keywords::filter]));
                                                            ^
/usr/include/boost/log/detail/sink_init_helpers.hpp:52:15: note: template<class CharT, class TraitsT, class AllocatorT> boost::log::v2s_mt_posix::filter boost::log::v2s_mt_posix::aux::acquire_filter(const std::basic_string<_CharT, _Traits, _Alloc>&)
 inline filter acquire_filter(std::basic_string< CharT, TraitsT, AllocatorT > const& filter)
               ^
/usr/include/boost/log/detail/sink_init_helpers.hpp:52:15: note:   template argument deduction/substitution failed:
/usr/include/boost/log/detail/sink_init_helpers.hpp:74:60: note:   ‘const TLogger::AddFileLog(severity_level, const string&)::<lambda()>’ is not derived from ‘const std::basic_string<_CharT, _Traits, _Alloc>’
     s.set_filter(aux::acquire_filter(args[keywords::filter]));
                                                            ^
/usr/include/boost/log/detail/sink_init_helpers.hpp:60:9: note: template<class FilterT> typename boost::enable_if<boost::phoenix::is_actor<T>, const FilterT&>::type boost::log::v2s_mt_posix::aux::acquire_filter(const FilterT&)
 >::type acquire_filter(FilterT const& filter)
         ^
/usr/include/boost/log/detail/sink_init_helpers.hpp:60:9: note:   template argument deduction/substitution failed:
/usr/include/boost/log/detail/sink_init_helpers.hpp: In substitution of ‘template<class FilterT> typename boost::enable_if<boost::phoenix::is_actor<T>, const FilterT&>::type boost::log::v2s_mt_posix::aux::acquire_filter(const FilterT&) [with FilterT = TLogger::AddFileLog(severity_level, const string&)::<lambda()>]’:
/usr/include/boost/log/detail/sink_init_helpers.hpp:74:60:   required from ‘void boost::log::v2s_mt_posix::aux::setup_filter(SinkT&, const ArgsT&, mpl_::false_) [with SinkT = boost::log::v2s_mt_posix::sinks::synchronous_sink<boost::log::v2s_mt_posix::sinks::text_file_backend>; ArgsT = boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::filter, const TLogger::AddFileLog(severity_level, const string&)::<lambda()> >, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::format, const char [25]>, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::file_name, const std::basic_string<char> >, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::rotation_size, int>, boost::parameter::aux::empty_arg_list> > > >; mpl_::false_ = mpl_::bool_<false>]’
/usr/include/boost/log/utility/setup/file.hpp:89:108:   required from ‘boost::shared_ptr<boost::log::v2s_mt_posix::sinks::synchronous_sink<boost::log::v2s_mt_posix::sinks::text_file_backend> > boost::log::v2s_mt_posix::aux::add_file_log(const ArgsT&) [with ArgsT = boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::filter, const TLogger::AddFileLog(severity_level, const string&)::<lambda()> >, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::format, const char [25]>, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::file_name, const std::basic_string<char> >, boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::rotation_size, int>, boost::parameter::aux::empty_arg_list> > > >]’
/usr/include/boost/log/utility/setup/file.hpp:127:1:   required from ‘boost::shared_ptr<boost::log::v2s_mt_posix::sinks::synchronous_sink<boost::log::v2s_mt_posix::sinks::text_file_backend> > boost::log::v2s_mt_posix::add_file_log(const T0&, const T1&, const T2&, const T3&) [with T0 = boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::file_name, const std::basic_string<char> >; T1 = boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::rotation_size, int>; T2 = boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::format, const char [25]>; T3 = boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::filter, const TLogger::AddFileLog(severity_level, const string&)::<lambda()> >]’
logger.cpp:37:5:   required from here
/usr/include/boost/log/detail/sink_init_helpers.hpp:60:9: error: no type named ‘type’ in ‘struct boost::enable_if<boost::phoenix::is_actor<TLogger::AddFileLog(severity_level, const string&)::<lambda()>, void>, const TLogger::AddFileLog(severity_level, const string&)::<lambda()>&>’

Что не так и как поправить?

 ,

aido
()

C++11 templated for-cycle

Доброго времени суток!

В с++11 появилась возможность делать шаблоны с переменным числом аргументов. При этом есть мануалы, как пройтись по списку всех переменных, переданных в функцию, даже если они разного типа, как посчитать количество переданных в шаблон типов. Но как пройтись по списку типов, не создавая переменных соответствующего типа?

Такая задача встала из необходимости создать контейнер для экземпляров разных классов, количество этих классов заранее неизвестно. При этом каждый класс имеет свои параметры инициализации, которые считываются из файла конфига. Какие будут параметры инициализации - тоже заранее неизвестно. Получается так, что надо бы определить в этих классах функцию чтения части конфига, которую далее вызывать еще до момента создания этих классов. Ясно, что она будет статиком. Но как ее вызывать для набора таких классов - хз.

Кароч, нужен какой-то вот такой код (суть, я думаю, ясна, хоть он и, очевидно, не работающий):

#include <libconfig.h++>
void f1()
{
    Config cfg;
    cfg.readFile("ololo.cfg");
    const Setting& settings = cfg.getRoot();
    template<class ...T>for(auto t: ...T)
    {
        t::LoadConfig(settings);
    }
}

 ,

aido
()

Изучаю Boost::singleton

Доброго времени суток!

В общем, такая стандартная задача стоит - сделать так, чтобы создавалось не больше 1 экземпляра некоторого класса (хоть на этапе выполнения, хоть на этапе компиляции). Первое, что приходит в голову - шаблон singleton, но я че-то хз, как им пользоваться и почему оно работает (отследить момент создания нового экземпляра несложно, а вот как запретить это?)...

Пробовал вот так (не копая глубоко в исходники буста):

#include <boost/serialization/singleton.hpp>
#include <iostream>
using namespace std;
using namespace boost::serialization;

template <class T> class TServer :
    public singleton<TServer<T>>
{
private:
    int a;
    T b;
public:
    TServer(int s) : a(s){
        cout<<"TServer"<<endl;
    }
    int geta(){return a;};
    int getb(){return b;};
    void setb(const T & c){b=c;};
};

int main(int argc, char**argv)
{
    TServer<int> fg(15);
    fg.setb(-5);
    cout<<fg.geta()<<endl;
    TServer<int> fg2(25);
    cout<<fg.getb()<<endl;
    cout<<fg2.getb()<<endl;
    cout<<fg.geta()<<endl;
    cout<<fg2.geta()<<endl;
    TServer<int> *fg3=new TServer<int>(105);
    cout<<fg.geta()<<endl;
    cout<<fg2.geta()<<endl;
    cout<<fg3->geta()<<endl;
    return 0;
}

Вывод:

TServer
15
TServer
-5
0
15
25
TServer
15
25
105

То есть создаются три разных экземпляра класса.

 ,

aido
()

nodejs + pm2

Доброго времени суток!

Дали задачу поднять пару web-серверов, оба написаны на nodejs, в документации к ним сказано, как их запускать и запускаются они ровно одинаково: пишется js-файл конфига самого сервера, затем json-файл конфига для pm2 (в нем указывается имя конфига сервера), который потом опцией передается в pm2 (pm2 start server.json). Прикол в том, что первый сервак таким образом подымается, а второй - нет.

pm2 logs выдает

Error: Конфигурация сервера с именем server2​ не найден

, хотя server2.js находится в той же папке с соответствующими правами.

Как можно узнать, где он ищет конфиги?

 

aido
()

RSS подписка на новые темы