Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: [РЕШЕНО] запуск Perl скрипта, чтоб видеть его в процессах  (Прочитано 3105 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн BorisPlus

  • Автор темы
  • Активист
  • *
  • Сообщений: 253
  • Болты вперед,болты назад,такой работе я очень рад!
    • Просмотр профиля
Привет всем. Уже наверно два месяца не могу найти решение.

Что нужно: Запустить Perl скрипт из Bash скрипта так, чтоб Perl скрипт сразу отпускал Bash скрипт (работал фоновым системным процессом) и был виден среди процессов исполнения (например ps -A) и при этом вывод Perl скрипта (как то: в файл, сообщения об ошибках и т.д.) не терялся.

Что я попробовал:
1 вариант:
Если из Bash запустить Perl скрипт, например, "`/basedir/myscript.pl`", то Bash ждет конца исполнения Perl. При этом в "ps -A" я вижу скрипт. - это ясно и понятно
2 вариант:
Добавление просто символа "&" - не помогает.
3 вариант:
Если использовать конструкцию "`/basedir/myscript.pl` &> /dev/null", то при этом в "ps -A" я вижу скрипт, но это очень сложно для отладки, поскольку при использовании "&> /dev/null"  необходимо быть абсолютно уверенным в правильности исходника.
4 вариант:
При переработке Perl скрипта с точки зрения помещения его логики в отдельный Perl thread, при вызове из Bash Perl скрипт  уходит в фоновый процесс, но почему-то не отрабатывает.

Что мне сделать? 3 вариант подходит, но не удовлетворяет до конца.
Заранее благодарю.
« Последнее редактирование: 09 Января 2011, 22:13:14 от BorisPlus »
Спасибо за помощь, товарищи!

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
А если не в /dev/null а в /var/log/myscript.log перенаправлять вывод?

Оффлайн BorisPlus

  • Автор темы
  • Активист
  • *
  • Сообщений: 253
  • Болты вперед,болты назад,такой работе я очень рад!
    • Просмотр профиля
не знаю, попробую, в мане именно с /dev/null без ожидания
тут еще подкинули идею с nohup

спасибо, я проверю

Пользователь решил продолжить мысль 09 Января 2011, 21:55:20:
nohup /basedir/myscript.pl - все равно ждет конца исполнения
как и
nohup perl /basedir/myscript.pl
nohup bash perl /basedir/myscript.pl

Еще нашел
nohup bash -c "exec ... - в процессе опробации
« Последнее редактирование: 09 Января 2011, 21:57:17 от BorisPlus »
Спасибо за помощь, товарищи!

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Если с nohup, то надо так:
nohup /basedir/myscript.pl &
Почитай "man nohup" "man kill" и "man 7 signal" чтобы понять зачем нужен nohup и нужен ли он тебе.

Конструкция
command &> /some/path
означает запусти команду command и перенаправь пожалуйста её стандартные потоки вывода и ошибок в указанный файл. /dev/null это такой специальный файл в который можно писать всё что угодно, и это чтоугодно будет тупо проигнорировано и никуда не записанно. Думаю этой информации должно хватить, чтобы разобраться в проблеме. Указанный мной в предыдущем посте путь это пример, вместо него можно использовать любой удобный для тебя файл (он будет пересоздан и в него полетит весь вывод скрипта).

Оффлайн BorisPlus

  • Автор темы
  • Активист
  • *
  • Сообщений: 253
  • Болты вперед,болты назад,такой работе я очень рад!
    • Просмотр профиля
Спасибо!!!
работает
nohup /basedir/myscript.pl &
ну как собственно и
nohup bash -c "exec /basedir/myscript.pl" &

с &> - разобрался,  спасибо - и кстати тоже работает)))

а в чем именно проблема с nohup может возникнуть? какой подводный камень?
« Последнее редактирование: 09 Января 2011, 22:22:53 от BorisPlus »
Спасибо за помощь, товарищи!

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Да не в чём, просто нужен ли он тебе? Он, если меня память не подводит, ничего не делает акромя игнорирования сигнала SIGHUP. Потому я тебе и порекомендовал почитать маны по сигналам, чтобы ты уже решил нужно ли тебе его игнорировать.

Оффлайн BorisPlus

  • Автор темы
  • Активист
  • *
  • Сообщений: 253
  • Болты вперед,болты назад,такой работе я очень рад!
    • Просмотр профиля
Спасибо, знаешь, раз работает с перенапрвлением "&>", то ты прав, мне не нужен nohup)
Спасибо за помощь, товарищи!

Оффлайн smaharbA

  • Участник
  • *
  • Сообщений: 220
    • Просмотр профиля
Единый скрипт
#!/usr/bin/env bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:$PATH

getfullname() {
    local path name
    path=`(echo ${BASH_SOURCE[0]}) 2>&1`
    path=${path%%:*}
    name=${path##*/}
    path=`cd "${path%/*}" 2> /dev/null;pwd`
    echo $path/$name
    }

fullname=`getfullname "$0"`
fullname=`readlink -f "$fullname"`
path=${fullname%/*}
name=${fullname##*/}
prog=${prog:=$name}
log=/var/log/$name.log

echo bash 1
perl -x $fullname > /dev/null &
echo bash 2
exit

#!/usr/bin/env perl

my $i=0;
while($i++ < 10) {
    print STDERR "perl $i\n";
    sleep 2;
    }
Я конечно далек от мысли...(с)

Оффлайн BorisPlus

  • Автор темы
  • Активист
  • *
  • Сообщений: 253
  • Болты вперед,болты назад,такой работе я очень рад!
    • Просмотр профиля
 ;)
верю, что этот "могучий" скрипт работает и "что-то там" делает.
проблема моя уже была решена, но все равно спасибо, smaharbA ))
Спасибо за помощь, товарищи!

 

Страница сгенерирована за 0.065 секунд. Запросов: 25.