Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Программирование на Lua _ Как вызвать bash скрипт из Lua

Автор: Iskandark 23.2.2015, 21:58

Всем привет!
Есть задача вызвать bash скрипт (в Linux) из Lua. Скрипт например может выполнять синхронизацию времени, отправку email или что угодно другое.

Возможно ли из Lua выполнить bash скрипт?

Автор: Alexey 24.2.2015, 6:42

Возможно.
http://mydc.ru/r/?http://www.lua.org/manual/5.1/manual.html#pdf-os.execute
http://mydc.ru/r/?http://www.lua.org/manual/5.1/manual.html#pdf-io.popen

Автор: Iskandark 25.2.2015, 11:09

Пробую из lua вызвать bash скрипт:

Код
os.execute('/var/myscripts/synctime.sh')


Скрипт выполняет синхронизацию времени, отдельно он запускается. Вот содержимое synctime.sh:
Код
#!/bin/bash

/usr/sbin/ntpdate-debian >> /var/log/synctime.log


Но в итоге хаб намертво зависает, а в процессах висит зависший процесс с исполнением /usr/sbin/ntpdate-debian


Пока его не убить, не отвисает...

Автор: deseven 25.2.2015, 20:45

Запускай ntpdate с ключом -v и логируй все.

Код
/usr/sbin/ntpdate -v pool.ntp.org >> /var/log/synctime.log 2>> /var/log/synctime_error.log

Автор: Iskandark 25.2.2015, 21:02

Цитата(deseven @ 25.2.2015, 20:45) *
Запускай ntpdate с ключом -v и логируй все.

Код
/usr/sbin/ntpdate -v pool.ntp.org >> /var/log/synctime.log 2>> /var/log/synctime_error.log


В /var/log/synctime_error.log пусто. А вот в /var/log/synctime.log написало:

Код
25 Feb 21:57:00 ntpdate[962]: ntpdate 4.2.6p5@1.2349-o Sat May 12 09:54:56 UTC 2012 (1)

Автор: deseven 25.2.2015, 21:41

Хорошо, добавь тогда еще и -d

Автор: Iskandark 25.2.2015, 22:39

Цитата(deseven @ 25.2.2015, 21:41) *
Хорошо, добавь тогда еще и -d


Для случая:
Код
/usr/sbin/ntpdate -v -d pool.ntp.org >> /var/log/synctime.log 2>> /var/log/synctime_error.log

Ничего не изменилось: в /var/log/synctime_error.log пусто, а в /var/log/synctime.log написало тоже самое "25 Feb 23:13:12 ntpdate[2042]: ntpdate 4.2.6p5@1.2349-o Sat May 12 09:54:56 UTC 2012 (1)"

Для случая:
Код
/usr/sbin/ntpdate -v pool.ntp.org >> /var/log/synctime.log 2>> /var/log/synctime_error.log -d

В /var/log/synctime_error.log появилась запись:
Код
Error resolving -d: Name or service not known (-2)
25 Feb 23:14:28 ntpdate[2083]: Can't find host -d: Name or service not known (-2)

Автор: deseven 26.2.2015, 0:44

интересно
а если просто так запустить с ключами -v и -d?
типичный вывод должен быть такого плана

Код
26 Feb 02:43:45 ntpdate[22400]: ntpdate 4.2.6p5@1.2349-o Sat Dec 20 02:51:49 UTC 2014 (1)
Looking for host 10.10.10.10 and service ntp
host found : 10.10.10.10
transmit(10.10.10.10)
transmit(10.10.10.10)
transmit(10.10.10.10)
transmit(10.10.10.10)
transmit(10.10.10.10)
10.10.10.10: Server dropped: no data
server 10.10.10.10, port 123
stratum 0, precision 0, leap 00, trust 000
refid [10.10.10.10], delay 0.00000, dispersion 64.00000
transmitted 4, in filter 4
reference time:    00000000.00000000  Thu, Feb  7 2036 11:28:16.000
originate timestamp: 00000000.00000000  Thu, Feb  7 2036 11:28:16.000
transmit timestamp:  d898c094.530edaa3  Thu, Feb 26 2015  2:43:48.324
filter delay:  0.00000  0.00000  0.00000  0.00000
         0.00000  0.00000  0.00000  0.00000
filter offset: 0.000000 0.000000 0.000000 0.000000
         0.000000 0.000000 0.000000 0.000000
delay 0.00000, dispersion 64.00000
offset 0.000000

26 Feb 02:43:49 ntpdate[22400]: no server suitable for synchronization found

Автор: Iskandark 26.2.2015, 10:22

Цитата(deseven @ 26.2.2015, 0:44) *
интересно
а если просто так запустить с ключами -v и -d?
типичный вывод должен быть такого плана
..


Если из консоли выполнить "ntpdate-debian -d", то вывод похож на представленный...

Автор: deseven 26.2.2015, 16:43

Делаем вывод, что при запуске из lua что-то отличается от обычного запуска.
Выполни /usr/bin/printenv > /tmp/env просто так
и /usr/bin/printenv > /tmp/env_lua с хаба.
Сравни что отличается.

Автор: Iskandark 26.2.2015, 22:40

Цитата(deseven @ 26.2.2015, 16:43) *
Делаем вывод, что при запуске из lua что-то отличается от обычного запуска.
Выполни /usr/bin/printenv > /tmp/env просто так
и /usr/bin/printenv > /tmp/env_lua с хаба.
Сравни что отличается.


Явных различий не заметил, кроме кодировки... Вот:

/usr/bin/printenv > /tmp/env

SHELL=/bin/bash
TERM=xterm
SSH_CLIENT=########
SSH_TTY=/dev/pts/0
USER=root
MC_TMPDIR=/tmp/mc-root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAIL=/var/mail/root
PWD=/
LANG=en_US.UTF-8
PS1=\h:\w\$
HISTCONTROL=ignorespace
HOME=/root
SHLVL=2
MC_SID=22170
LOGNAME=root
SSH_CONNECTION=####################
OLDPWD=/tmp
_=/usr/bin/printenv


/usr/bin/printenv > /tmp/env_lua

MAIL=/var/mail/root
SSH_CLIENT=#########
USER=root
SHLVL=2
HOME=/root
OLDPWD=/
SSH_TTY=/dev/pts/0
PS1=\h:\w\$
LOGNAME=root
_=/etc/init.d/ptokax4test
TERM=xterm
MC_SID=22170
HISTCONTROL=ignorespace
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MC_TMPDIR=/tmp/mc-root
LANG=ru_RU.CP1251
SHELL=/bin/bash
PWD=/
SSH_CONNECTION=#############


IP заменил на ####

Попробовал из lua выполнить os.execute('ntpdate-debian') без bash скрипта. Опять процесс завис, значит дело не в bash, а в этом в команде "ntpdate-debian"

Хотя в консоли без lua отрабатывает без проблем.

Автор: deseven 27.2.2015, 9:07

ntpdate-debian это просто скрипт-враппер над обычным ntpdate
вместо него достаточно вызывать просто /usr/sbin/ntpdate pool.ntp.org

я думаю LANG может иметь значение
попробуй в скрипте который вызываешь написать так

Код
LANG=en_US.UTF-8; /usr/sbin/ntpdate -v -d pool.ntp.org >> /var/log/synctime.log 2>&1


с другой стороны, возможно это что-то со стороны lua
пробовал свой скрипт запускать фоном?
Код
os.execute('/var/myscripts/synctime.sh &')

Автор: Iskandark 27.2.2015, 10:12

Запихал в sh скрипт "LANG=en_US.UTF-8; /usr/sbin/ntpdate -v -d pool.ntp.org >> /var/log/synctime.log 2>&1"

При выполнении через lua результат старый - процесс синхронизации висит в задачах
При выполнении через консоль - выполняется корректно

При запуске sh скрипта в фоне из lua результат почти такой же - процесс синхронизации висит в задачах за исключение того, что хаб не зависает и не ждет ответа от выполнения...

Автор: deseven 27.2.2015, 17:10

у меня кончились идеи
если только запускать gdb и смотреть на какой операции ntpdate виснет

а это только с ntpdate происходит?

Автор: Iskandark 3.3.2015, 12:42

Цитата(deseven @ 27.2.2015, 17:10) *
у меня кончились идеи
если только запускать gdb и смотреть на какой операции ntpdate виснет

а это только с ntpdate происходит?


Проверил, только с ntpdate такое происходит. Если в bash скрипт вставить строки с исполнением lua файла, то без проблем отрабатывается...

Значит дело не в bash, а в ntpdate...