Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

Открыть новую тему     Написать ответ в эту тему

digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Товарищи вопрошающие! Если ваша система отлична от ГНУ, и в то же время вы желаете обойтись только дефолтными средствами, указывайте и то и другое сразу, пожалуйста.


UNIX Shell

 
   Это глобальная тема по юниксовой командной оболочке, как по интерактивной работе в командной строке, так и по шелл-скриптам. Ключевые слова: sh, bash, zsh, tcsh, busybox, readline, coreutils, cp, mv, ln, rm, ls, readlink, mkdir, touch, stat, date, test, sleep, chown, chmod, chattr, dd, df, du, env, echo, cat, less, man, grep, sort, findutils, find, locate, xargs, md5sum, cmp, diff, patch, ps, kill, killall, tar, gzip, bzip2, xz, mount, fdisk, parted, mkfs, fsck, e2fsprogs, mtools, ss, netcat, netstat, rsync, ssh, scp, sftp, lftp, ncftp, time, strace.
   Неинтерактивная обработка текста (sed, awk, perl) пока тоже здесь.
   Смотри в других ветках: wget, convert, montage, mogrify и др., gs, git, 7z, p7zip, soffice, mplayer, mencoder, vlc, vim, mc, mcedit, kioclient.
 
 

Hint! Русские маны (подустаревшие, не всегда полные и не всегда для вашей системы) можно попытаться найти на Опеннете, к примеру: bash, tar, grep.

 
Готовые решения:
  • commandlinefu.com
    Крупнейшая база полезных однострочников на командной оболочке с ранжированием на основе пользовательского голосования.
     
  • shell-fu.org
    Аналогично, но поменьше и формат записей более свободный, поэтому встречаются и однострочники, и развернутые скрипты, и просто советы.
     
  • Useful one-line scripts for sed
    Почти исчерпывающий список решений для тех случаев, когда sed незаменим. Более сложные скрипты с sed.sf.net — только для тех, кто знает толк... :)

 
Учебная литература:
  • Greg’s Wiki (http://mywiki.wooledge.org)
    Наиболее обширный авторский сборник постоянно обновляющихся материалов по Башу.

    1. Bash Pitfalls
      (Частые ошибки программирования на Баше: [1], [2], [3], [4], [5] — пер. на русский по сост. на дек. 2008 г.).
      Рассмотрены преимущественно ошибки, возникающие из-за непонимания отличия шелла от «нормальных» скриптовых языков. Если вы уже владеете, например, Перлом, то это вполне может быть ваше первое руководство для ознакомления с Башем.
    2. Bash FAQ
    3. Bash Guide
    4. Bash Reference Sheet
      Шпаргалка по частым синтаксическим оборотам.

 
Классическая учебная литература:
С одной стороны не упомянуть эти издания нельзя, с другой — они настолько устарели, что едва ли их можно рекомендовать в роли учебника.

 

Смело правьте и дополняйте шапку, однако не забывайте отписываться об исправлениях и сохранять исходный вариант под #.
Первый пост темы имел вид...

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 18:51 16-05-2008 | Исправлено: qw12, 09:42 24-03-2020
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> Ну perl как и наверное всё можно собрать статично.
 
Из-за такой ерунды?  Там одну строчку переписать для совместимости со старым интерфейсом:
 

@@ -23,7 +23,7 @@
   $self->{system_dir} = "$i/system";
   my $config = "$i/config/$id_.xml";
   $self->{import_dir} = ($xml_parser
-                         ->load_xml(location => $config)
+                         ->parse_file($config)
                          ->find('//placeholder[@name="importPath"]/node()')
                          ->string_value());
   return bless $self, $class;

 
Ну или программка полностью...
 
CrownRU, я прошу прощения, мне наверное надо было сообразить, что 1.70 — не такая уж и старая версия.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:57 31-08-2016 | Исправлено: ASE_DAG, 17:58 31-08-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Из-за такой ерунды?  Там одну строчку переписать для совместимости со старым интерфейсом
из-за того что уже не первый раз то в bash'е, то в perl'е мы втыкаемся в софт каменного века. Почему бы не иметь актуальные статичные версии итерпритаторов, если уж админы там отказываются что-либо обновлять.

Цитата:
мне наверное надо было сообразить, что 1.70 — не такая уж и старая версия
Это ж не только сообразить надо было, но ещё и знать, что интерфейс менялся в 1.70 версии. Мне пришлось погуглить для этого, т.к. в perldoc'е я на такую информацию не наткнулся.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6565 | Зарегистр. 28-08-2008 | Отправлено: 18:06 31-08-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Спасибо огромное!
Завтра попробую и сразу отпишусь. Жду ответа на ЛС
 
Добавлено:
Alukardd

Цитата:
 
мне наверное надо было сообразить, что 1.70 — не такая уж и старая версия
Это ж не только сообразить надо было, но ещё и знать, что интерфейс менялся в 1.70 версии. Мне пришлось погуглить для этого, т.к. в perldoc'е я на такую информацию не наткнулся.

 
Спасибо!
Сегодня застращал начальство, что системы дырявые. Надеюсь дойдет и наконец обновят их. Админы молят меня, чтобы я оставил их в покое до пенсии

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 18:43 31-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Почему бы не иметь актуальные статичные версии итерпритаторов
 
Так а толку?  Здесь не в версии Перла дело, как ошибочно предположил т. CrownRU, став искать обновления для него (# zypper up perl); а в версии libxml-libxml-perl (это в Дебиане пакет зовется так, как в Сузе, я не знаю).   Которая, как можно предположить, должна быть если не точно, то в каких пределах согласована с версией libxml2.  Ее тоже собирать?
 
Хотя тот же load_xml(), как можно узнать, — это действительно всего-лишь внутриперловский сахар.  Я даже затрудняюсь сказать, для чего его вообще ввели.  Вероятно, в порядке совместимости с чем-нибудь.
 
> Это ж не только сообразить надо было, но ещё и знать, что интерфейс менялся в 1.70 версии.
 
Ну так это в документации же написано.  Может быть, вы помните синтаксис XML::LibXML наизусть, я-то — нет, поэтому прежде чем что-либо писать пробежался по ней глазами.
 
> Мне пришлось погуглить для этого, т.к. в perldoc'е я на такую информацию не наткнулся.
 
Ну и вышли на него же.  Бывает.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:10 31-08-2016 | Исправлено: ASE_DAG, 20:27 31-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> текущую версию наверное проще всего узнать так: perldoc -t XML::LibXML | grep -A1 '^VERSION$'
 
Да вы просто мастер костыля! :-)  Я уже давно и забыл, что grep(1) так умеет.
 
А вообще: $ perl -mXML::LibXML -e 'print XML::LibXML->VERSION, "\n"'

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:42 31-08-2016 | Исправлено: ASE_DAG, 22:43 31-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> А среди моих знакомых, есть те которые не зависимро от execute bit'а пишут sh script.sh, т.о. изменив содержимое на perl ни чего хорошо и так не выйдет.  
 
Обосновывать дурную, но в целом безвредную привычку другой — уже откровенно глупой и опасной — это сильно!

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 01:13 01-09-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
XML::LibXML->VERSION
Эх, там ООП интерйейс, и функция... А я проверил только переменную XML::LibXML::VERSION, после чего решил использовать perldoc.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6565 | Зарегистр. 28-08-2008 | Отправлено: 01:18 01-09-2016 | Исправлено: Alukardd, 01:46 01-09-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> А я проверил только переменную XML::LibXML::VERSION
 
Как это может быть переменной?  Скалярные переменные в Перле начинаются с доллара, а голое слово — это чаще всего именно функция (подпрограмма).
 
Такой сущности как XML::LibXML::VERSION просто нет, но похожая на нее XML::LibXML::LIBXML_VERSION — это именно подпрограмма (что возвращает версию двоичной библиотеки, если что).  Это легко проверить — подставьте к голому слову маркер функции — амперсанд:
 

$ perl -MXML::LibXML -de1
 
DB<1> print XML::LibXML::LIBXML_VERSION # bareword
20901
DB<2> print &XML::LibXML::LIBXML_VERSION # function
20901
DB<3> print $XML::LibXML::LIBXML_VERSION # scalar
 
DB<4>  


----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 01:56 01-09-2016 | Исправлено: ASE_DAG, 01:57 01-09-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
После ~10 секундной паузы опять выдал ошибку:
 

Код:
MO-0A248:/archive/obj/bastore/F/FQT_RA # /tmp/saveidx /archive/obj/bastore F/FQT_RA
Operation in progress at /usr/lib/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi/XML/LibXML.pm line 587. at /tmp/saveidx line 25

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 09:38 01-09-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Как это может быть переменной?
Методы тоже можно вызвать таким образом. Просто тут разработчик либы не позаботился об этом.
Что бы оно заработало достаточно внести малюсенькое исправление в модуль. Конечно я не заботился о различных ситуациях, а сделал тяп-ляр, просто что бы показать Вам что так тоже можно.
У меня это 41я строка модуля (она же 1я строка метода VERSION), теперь она выглядит так:
my $class = shift // 'XML::LibXML';
И тогда вызов работает норм:
perl -MXML::LibXML -e 'print XML::LibXML::VERSION'

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6565 | Зарегистр. 28-08-2008 | Отправлено: 10:07 01-09-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU, привет. :-)  Если я долго никак не отвечаю, а вроде бы намеревался, то вполне вероятно, что есть смысл мне написать и напомнить — я ведь мог и просто пропустить сообщение мимо.  И нет, ни в коем случае не по здешней внутренней почте — она никуда дальше Руборда не идет, на нормальную э-почту.  Ты ее и так знаешь, но на всякий случай (который весьма вероятен в свете последних событий вокруг Руборда) вписал адресок в подпись.
 


Теперь по существу.
 
> После ~10 секундной паузы опять выдал ошибку:
 
А вот не могу ничем обрадовать.  Понятно, надеюсь, что это не совсем ошибка, это он сообщает, что за эти десять секунд так и не смог разобрать конфиг.  Это, конечно, ненормально, но учитывая, что у меня все работает, даже и не знаю, что предположить.  У меня оно правда работает не на F/FQT_RA (который мне никто не давал), а на N/NSP_F3, но, я надеюсь, они по форме одинаковые.
 
Так что не могу предложить ничего лучше, чем дергать из Перла xsltproc, который у нас, кажется, работал вполне корректно:
 

#!/usr/bin/perl
 
# package CrownRU::LibXML;
 
# use warnings;
# use XML::LibXML;
 
# my $xml_parser = XML::LibXML->new(validate => 0,
#                                   load_ext_dtd => 0);
 
# sub xpath
# {
#   my ($file, $xpath) = @_;
#   return $xml_parser->parse_file($file)->find($xpath)->string_value;
# }
 
package CrownRU::XSLTProc;
 
use warnings;
use IPC::Run 'run';
 
sub xpath
{
  my ($file, $xpath) = @_;
  my $in = <<"EOF";
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="utf-8" />
  <xsl:template match="/">
    <xsl:value-of select='$xpath' />
  </xsl:template>
</xsl:stylesheet>
EOF
  my ($out, $err);
  run ['xsltproc', '--novalid', '--nonet', '-', $file], \$in, \$out, \$err;
  length $out
    or die "$err";
  return $out;
}
 
package CrownRU;
 
use warnings;
use File::Path;
use File::Copy;
 
# *xpath = \&CrownRU::LibXML::xpath;
*xpath = \&CrownRU::XSLTProc::xpath;
 
sub new
{
  my ($class, $dir, $id) = @_;
  my $i = "$dir/$id";
  -d $i
    or die "$i: $!";
  my $self = { id => $id };
  (my $id_ = $id) =~ tr,/,_,;
  $self->{initscript} = "$i/bin/$id_";
  $self->{failed_dir} = "$i/failed";
  $self->{system_dir} = "$i/system";
  my $config = "$i/config/$id_.xml";
  $self->{import_dir} = xpath($config,
                              '//placeholder[@name="importPath"]/node()');
  return bless $self, $class;
}
 
sub id
{
  my $self = shift;
  return $self->{id};
}
 
sub start
{
  my $self = shift;
  system $self->{initscript}, 'start';
}
 
sub stop
{
  my $self = shift;
  system $self->{initscript}, 'stop';
}
 
sub process_failed
{
  my $self = shift;
  my @idxs = glob "$self->{failed_dir}/*.idx"
    or return;
  $self->stop();
  rmtree $self->{system_dir};
  move $_, $self->{import_dir} for @idxs;
  $self->start();
}
 
 
package main;
 
use warnings;
use Sys::Syslog qw(:standard :extended);
use Getopt::Long;
 
my $SCRIPTNAME = 'idxsafe';
 
my $syslog = 1;
my $timeout = 5 * 60;
 
GetOptions("no-syslog" => sub { $syslog = 0 },
           "timeout=i" => \$timeout);
 
@ARGV >= 1
  or die ("Usage examples:\n" .
          "    \$ $SCRIPTNAME /archive/obj/bastore\n" .
          "    \$ $SCRIPTNAME /archive/obj/bastore N/NST_F3 F/FQP_RA\n");
 
openlog $SCRIPTNAME, 'pid', LOG_USER;
 
$syslog
  or setlogsock 'stream', '/dev/stderr';
 
$SIG{__WARN__} = sub { syslog LOG_WARNING, @_ };
$SIG{__DIE__} = sub { syslog LOG_ERR, @_ };
 
my ($wd, @ids) = @ARGV;
 
-d $wd
  or die "$wd: $!";
 
chdir $wd
  or die "$!";
 
my @instances = map { CrownRU->new($wd, $_) } (@ids
                                               ? @ids
                                               : glob '?/???_*');
 
@instances > 0
  or die "No instances found";
 
syslog(LOG_INFO,
       "Started successfully on: %s", join ', ', map { $_->id } @instances);
 
for (;;) {
  for (@instances) {
    $_->process_failed()
      and syslog LOG_INFO, "%s restored", $_->id;
  }
  exit if $timeout < 0;
  sleep $timeout;
}


----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 07:40 07-09-2016 | Исправлено: ASE_DAG, 07:42 07-09-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Привет. Ну мало ли. Может другие дела навалились...
Все равно ошибка вылазит:
 

Код:
# /tmp/saveidx /archive/obj/bastore F/FQT_RA
Can't locate IPC/Run.pm in @INC (@INC contains: /usr/lib/perl5/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/5.10.0 /usr/lib/perl5/site_perl/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.10.0 /usr/lib/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.10.0 /usr/lib/perl5/vendor_perl .) at /tmp/saveidx line 20.
BEGIN failed--compilation aborted at /tmp/saveidx line 20.
 

 
Там действительно так сложно нужно? И наверное (жирным выделил) лишнее) saveidx /archive/obj/bastore F/FQT_RA.
Все равно огромное спасибо!

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 10:13 07-09-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
 
> Can't locate IPC/Run.pm in @INC
 
Ну это модуля в системе нет.  Не обязан, конечно, но мне казалось, что он довольно распространенный, извиняюсь.  Ладно, завяжемся еще и на оболочку:
 

#!/usr/bin/perl
 
# package CrownRU::LibXML;
 
# use warnings;
# use XML::LibXML;
 
# my $xml_parser = XML::LibXML->new(validate => 0,
#                                   load_ext_dtd => 0);
 
# sub xpath
# {
#   my ($file, $xpath) = @_;
#   return $xml_parser->parse_file($file)->find($xpath)->string_value;
# }
 
package CrownRU::XSLTProc;
 
use warnings;
 
sub xpath
{
  my ($file, $xpath) = @_;
  return qx(xsltproc --novalid --nonet - "$file" <<EOF
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="utf-8" />
  <xsl:template match="/">
    <xsl:value-of select='$xpath' />
  </xsl:template>
</xsl:stylesheet>
EOF)
}
 
package CrownRU;
 
use warnings;
use File::Path;
use File::Copy;
 
# *xpath = \&CrownRU::LibXML::xpath;
*xpath = \&CrownRU::XSLTProc::xpath;
 
sub new
{
  my ($class, $dir, $id) = @_;
  my $i = "$dir/$id";
  -d $i
    or die "$i: $!";
  my $self = { id => $id };
  (my $id_ = $id) =~ tr,/,_,;
  $self->{initscript} = "$i/bin/$id_";
  $self->{failed_dir} = "$i/failed";
  $self->{system_dir} = "$i/system";
  my $config = "$i/config/$id_.xml";
  $self->{import_dir} = xpath($config,
                              '//placeholder[@name="importPath"]/node()');
  return bless $self, $class;
}
 
sub id
{
  my $self = shift;
  return $self->{id};
}
 
sub start
{
  my $self = shift;
  system $self->{initscript}, 'start';
}
 
sub stop
{
  my $self = shift;
  system $self->{initscript}, 'stop';
}
 
sub process_failed
{
  my $self = shift;
  my @idxs = glob "$self->{failed_dir}/*.idx"
    or return;
  $self->stop();
  rmtree $self->{system_dir};
  move $_, $self->{import_dir} for @idxs;
  $self->start();
}
 
 
package main;
 
use warnings;
use Sys::Syslog qw(:standard :extended);
use Getopt::Long;
 
my $SCRIPTNAME = 'idxsafe';
 
my $syslog = 1;
my $timeout = 5 * 60;
 
GetOptions("no-syslog" => sub { $syslog = 0 },
           "timeout=i" => \$timeout);
 
@ARGV >= 1
  or die ("Usage examples:\n" .
          "    \$ $SCRIPTNAME /archive/obj/bastore\n" .
          "    \$ $SCRIPTNAME /archive/obj/bastore N/NST_F3 F/FQP_RA\n");
 
openlog $SCRIPTNAME, 'pid', LOG_USER;
 
$syslog
  or setlogsock 'stream', '/dev/stderr';
 
$SIG{__WARN__} = sub { syslog LOG_WARNING, @_ };
$SIG{__DIE__} = sub { syslog LOG_ERR, @_ };
 
my ($wd, @ids) = @ARGV;
 
-d $wd
  or die "$wd: $!";
 
chdir $wd
  or die "$!";
 
my @instances = map { CrownRU->new($wd, $_) } (@ids
                                               ? @ids
                                               : glob '?/???_*');
 
@instances > 0
  or die "No instances found";
 
syslog(LOG_INFO,
       "Started successfully on: %s", join ', ', map { $_->id } @instances);
 
for (;;) {
  for (@instances) {
    $_->process_failed()
      and syslog LOG_INFO, "%s restored", $_->id;
  }
  exit if $timeout < 0;
  sleep $timeout;
}

 
> Там действительно так сложно нужно?  :-( И наверное (жирным выделил) лишнее) saveidx /archive/obj/bastore F/FQT_RA.
 
В каком смысле?

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 10:34 07-09-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
> Там действительно так сложно нужно?   И наверное (жирным выделил) лишнее) saveidx /archive/obj/bastore F/FQT_RA.
 
В каком смысле?
 

Я имею ввиду, что вот так было бы логичней просто: saveidx FQT_RA
 
Сейчас проверю.
 
Запустил - висит, в смысле не выходит в шелл, но похоже работает. Во всяком случае тестовый файл переместился из failed.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 10:53 07-09-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU> Я имею ввиду, что вот так было бы логичней просто: saveidx FQT_RA
 
Да бога ради.

@@ -95,18 +95,15 @@
 use Sys::Syslog qw(:standard :extended);
 use Getopt::Long;
 
-my $SCRIPTNAME = 'idxsafe';
+my $SCRIPTNAME = 'saveidx';
 
 my $syslog = 1;
 my $timeout = 5 * 60;
+my $wd = '/archive/obj/bastore';
 
 GetOptions("no-syslog" => sub { $syslog = 0 },
-           "timeout=i" => \$timeout);
-
-@ARGV >= 1
-  or die ("Usage examples:\n" .
-          "    \$ $SCRIPTNAME /archive/obj/bastore\n" .
-          "    \$ $SCRIPTNAME /archive/obj/bastore N/NST_F3 F/FQP_RA\n");
+           "timeout=i" => \$timeout,
+           "wd=s" => \$wd);
 
 openlog $SCRIPTNAME, 'pid', LOG_USER;
 
@@ -116,7 +113,7 @@
 $SIG{__WARN__} = sub { syslog LOG_WARNING, @_ };
 $SIG{__DIE__} = sub { syslog LOG_ERR, @_ };
 
-my ($wd, @ids) = @ARGV;
+my @ids = @ARGV;
 
 -d $wd
   or die "$wd: $!";

 
> ...но похоже работает.  Во всяком случае тестовый файл переместился из failed.
 
Можно еще в сислог заглянуть, посмотреть, о чем эта хрень отчиталась.
 


----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 11:11 07-09-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Можно еще в сислог заглянуть, посмотреть, о чем эта хрень отчиталась.  

 
 
Так ошибка в пути:

Код:
# /tmp/saveidx FST_YE
/archive/obj/bastore/FST_YE: No such file or directory at /tmp/saveidx line 49.
 

 
Приходится так:
# /tmp/saveidx F/FST_YE
 
Ой, да, извини, забыл лог выложить.
 

Код:
Sep  7 10:47:56 MO-0A248 saveidx[28218]: /archive/obj/bastore/FST_YE: No such file or directory at /tmp/saveidx line 49.
Sep  7 10:48:38 MO-0A248 saveidx[28237]: Started successfully on: F/FST_YE
Sep  7 10:48:38 MO-0A248 saveidx[28240]: Can't exec "/archive/obj/bastore/F/FST_YE/bin/F_FST_YE": No such file or directory at /tmp/saveidx line 77.
Sep  7 10:48:38 MO-0A248 saveidx[28237]: cannot unlink file for /archive/obj/bastore/F/FST_YE/system/.nfs0000000000246dda00000005: Device or resource busy at /tmp/saveidx line 86
Sep  7 10:48:38 MO-0A248 saveidx[28237]: cannot restore permissions to 0100666 for /archive/obj/bastore/F/FST_YE/system/.nfs0000000000246dda00000005: Device or resource busy at /tmp/saveidx line 86
Sep  7 10:48:38 MO-0A248 saveidx[28237]: cannot unlink file for /archive/obj/bastore/F/FST_YE/system/.nfs0000000000246ddc00000006: Device or resource busy at /tmp/saveidx line 86
Sep  7 10:48:38 MO-0A248 saveidx[28237]: cannot restore permissions to 0100666 for /archive/obj/bastore/F/FST_YE/system/.nfs0000000000246ddc00000006: Device or resource busy at /tmp/saveidx line 86
Sep  7 10:48:38 MO-0A248 saveidx[28237]: cannot remove directory for /archive/obj/bastore/F/FST_YE/system: Directory not empty at /tmp/saveidx line 86
Sep  7 10:48:38 MO-0A248 saveidx[28241]: Can't exec "/archive/obj/bastore/F/FST_YE/bin/F_FST_YE": No such file or directory at /tmp/saveidx line 71.
Sep  7 10:48:38 MO-0A248 saveidx[28237]: F/FST_YE restored
 


Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 11:53 07-09-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU> # /tmp/saveidx FST_YE
 
А!  Тебе еще и без префикса.  Ну вот так должно приниматься как с, так и без:
 

#!/usr/bin/perl
 
# package CrownRU::LibXML;
 
# use warnings;
# use XML::LibXML;
 
# my $xml_parser = XML::LibXML->new(validate => 0,
#                                   load_ext_dtd => 0);
 
# sub xpath
# {
#   my ($file, $xpath) = @_;
#   return $xml_parser->parse_file($file)->find($xpath)->string_value;
# }
 
package CrownRU::XSLTProc;
 
use warnings;
 
sub xpath
{
  my ($file, $xpath) = @_;
  return qx(xsltproc --novalid --nonet - "$file" <<EOF
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="utf-8" />
  <xsl:template match="/">
    <xsl:value-of select='$xpath' />
  </xsl:template>
</xsl:stylesheet>
EOF)
}
 
package CrownRU;
 
use warnings;
use File::Path;
use File::Copy;
 
# *xpath = \&CrownRU::LibXML::xpath;
*xpath = \&CrownRU::XSLTProc::xpath;
 
sub new
{
  my ($class, $dir, $id) = @_;
  my $pfx = substr $id, 0, 1;
  my $i = "$dir/$pfx/$id";
  -d $i
    or die "$i: $!";
  my $self = { id => $id };
  $self->{initscript} = "$i/bin/${pfx}_${id}.sh";
  $self->{failed_dir} = "$i/failed";
  $self->{system_dir} = "$i/system";
  my $config = "$i/config/${pfx}_${id}.xml";
  $self->{import_dir} = xpath($config,
                              '//placeholder[@name="importPath"]/node()');
  return bless $self, $class;
}
 
sub id
{
  my $self = shift;
  return $self->{id};
}
 
sub start
{
  my $self = shift;
  system $self->{initscript}, 'start';
}
 
sub stop
{
  my $self = shift;
  system $self->{initscript}, 'stop';
}
 
sub process_failed
{
  my $self = shift;
  my @idxs = glob "$self->{failed_dir}/*.idx"
    or return;
  $self->stop();
  rmtree $self->{system_dir};
  move $_, $self->{import_dir} for @idxs;
  $self->start();
}
 
 
package main;
 
use warnings;
use Sys::Syslog qw(:standard :extended);
use Getopt::Long;
 
my $SCRIPTNAME = 'saveidx';
 
my $syslog = 1;
my $timeout = 5 * 60;
my $wd = '/archive/obj/bastore';
 
GetOptions("no-syslog" => sub { $syslog = 0 },
           "timeout=i" => \$timeout,
           "wd=s" => \$wd);
 
openlog $SCRIPTNAME, 'pid', LOG_USER;
 
$syslog
  or setlogsock 'stream', '/dev/stderr';
 
$SIG{__WARN__} = sub { syslog LOG_WARNING, @_ };
$SIG{__DIE__} = sub { syslog LOG_ERR, @_ };
 
my @ids = @ARGV;
 
-d $wd
  or die "$wd: $!";
 
chdir $wd
  or die "$!";
 
my @instances = map { s,^./,,;
                      CrownRU->new($wd, $_); } (@ids
                                                ? @ids
                                                : glob '?/???_*');
 
@instances > 0
  or die "No instances found";
 
syslog(LOG_INFO,
       "Started successfully on: %s", join ', ', map { $_->id } @instances);
 
for (;;) {
  for (@instances) {
    $_->process_failed()
      and syslog LOG_INFO, "%s restored", $_->id;
  }
  exit if $timeout < 0;
  sleep $timeout;
}

 
> Ой, да, извини, забыл лог выложить.
> Can't exec "/archive/obj/bastore/F/FST_YE/bin/F_FST_YE": No such file or directory at /tmp/saveidx line 77.
 
Ну это я, как ты уже понял, пока вся шла вся эта тягомотина, суффикс .sh потерял (выше исправлено).
 
> Сannot unlink file for /archive/obj/bastore/F/FST_YE/system/.nfs0000000000246dda00000005: Device or resource busy at /tmp/saveidx line 86
 
А вот это не ко мне.  Впрочем, вероятно, это из-за неостанова, да?
 
Кстати говоря, в порядке тестирования, ведь наверное, сислог засорять ни к чему, да и бесконечный цикл не нужен, так что почему бы тебе не запускать его с ключами --no-syslog --timeout -1?


----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:18 09-09-2016 | Исправлено: ASE_DAG, 16:09 09-09-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Вроде работает, только в логе:

Код:
MO-0A248 saveidx[6566]: cannot remove directory for /archive/obj/bastore/N/NST_Y/system: Das Verzeichnis ist nicht leer at /tmp/saveidx line 86
 

там не директория, а содержимое директории должно стираться.
 
И можно без ключей сделать, чтобы они запускались по умолчанию, раз без них вис происходит?
И еще, можно между stop - start вставить короткий sleep на 3 секунды?

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 11:42 19-09-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
 
> cannot remove directory for /archive/obj/bastore/N/NST_Y/system: Das Verzeichnis ist nicht leer at /tmp/saveidx line 86
 
Что по русски говоря значит «каталог не пуст»?  Не могу сказать, что ему не нравится — само собой, он не пуст, поэтому и rmtree.
 
Однако коль скоро имеется такое чудное требование, что «там не директория, а содержимое директории должно стираться», то просто вот:
 

#!/usr/bin/perl
 
# package CrownRU::LibXML;
 
# use warnings;
# use XML::LibXML;
 
# my $xml_parser = XML::LibXML->new(validate => 0,
#                                   load_ext_dtd => 0);
 
# sub xpath
# {
#   my ($file, $xpath) = @_;
#   return $xml_parser->parse_file($file)->find($xpath)->string_value;
# }
 
package CrownRU::XSLTProc;
 
use warnings;
 
sub xpath
{
  my ($file, $xpath) = @_;
  return qx(xsltproc --novalid --nonet - "$file" <<EOF
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="utf-8" />
  <xsl:template match="/">
    <xsl:value-of select='$xpath' />
  </xsl:template>
</xsl:stylesheet>
EOF)
}
 
package CrownRU;
 
use warnings;
use File::Path;
use File::Copy;
 
# *xpath = \&CrownRU::LibXML::xpath;
*xpath = \&CrownRU::XSLTProc::xpath;
 
sub new
{
  my ($class, $dir, $id) = @_;
  my $pfx = substr $id, 0, 1;
  my $i = "$dir/$pfx/$id";
  -d $i
    or die "$i: $!";
  my $self = { id => $id };
  $self->{initscript} = "$i/bin/${pfx}_${id}.sh";
  $self->{failed_dir} = "$i/failed";
  $self->{system_dir} = "$i/system";
  my $config = "$i/config/${pfx}_${id}.xml";
  $self->{import_dir} = xpath($config,
                              '//placeholder[@name="importPath"]/node()');
  return bless $self, $class;
}
 
sub id
{
  my $self = shift;
  return $self->{id};
}
 
sub start
{
  my $self = shift;
  system $self->{initscript}, 'start';
}
 
sub stop
{
  my $self = shift;
  system $self->{initscript}, 'stop';
}
 
sub clear_system_dir
{
  my $self = shift;
  opendir my $dh, $self->{system_dir};
  for (readdir $dh) {
    $_ ne '.' && $_ ne '..'
      or next;
    my $f = "$self->{system_dir}/$_";
    if (-d $f) {
      rmtree $f;
    } else {
      unlink $f;
    }
  }
}
 
sub process_failed
{
  my $self = shift;
  my @idxs = glob "$self->{failed_dir}/*.idx"
    or return;
  $self->stop();
  $self->clear_system_dir();
  move $_, $self->{import_dir} for @idxs;
  $self->start();
}
 
 
package main;
 
use warnings;
use Sys::Syslog qw(:standard :extended);
use Getopt::Long;
 
my $SCRIPTNAME = 'saveidx';
 
my $syslog = 1;
my $timeout = 5 * 60;
my $wd = '/archive/obj/bastore';
 
GetOptions("no-syslog" => sub { $syslog = 0 },
           "timeout=i" => \$timeout,
           "wd=s" => \$wd);
 
openlog $SCRIPTNAME, 'pid', LOG_USER;
 
$syslog
  or setlogsock 'stream', '/dev/stderr';
 
$SIG{__WARN__} = sub { syslog LOG_WARNING, @_ };
$SIG{__DIE__} = sub { syslog LOG_ERR, @_ };
 
my @ids = @ARGV;
 
-d $wd
  or die "$wd: $!";
 
chdir $wd
  or die "$!";
 
my @instances = map { s,^./,,;
                      CrownRU->new($wd, $_); } (@ids
                                                ? @ids
                                                : glob '?/???_*');
 
@instances > 0
  or die "No instances found";
 
syslog(LOG_INFO,
       "Started successfully on: %s", join ', ', map { $_->id } @instances);
 
for (;;) {
  for (@instances) {
    $_->process_failed()
      and syslog LOG_INFO, "%s restored", $_->id;
  }
  exit if $timeout < 0;
  sleep $timeout;
}

 
> И можно без ключей сделать, чтобы они запускались по умолчанию, раз без них вис происходит?
 
ОМГ.  Какой еще «вис»?  Я, конечно, за такое время уже, может быть, все и забыл, но по-моему это условием задачи было, чтоб программка: а) проверяла, не валяются ли упавшие файлы, *регулярно* (здесь я уже не помню по какой причине задался интервалом по-умолчанию в пять минут), б) писала в системный лог; не?
 
> И еще, можно между stop - start вставить короткий sleep на 3 секунды?
 
Я думаю, что без проблем.  Однако, как можно заметить, между start и stop происходит собственно работа над файлами в двух строчках, так что вставляй в любое из трех возможных мест.  Образец там есть.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 07:41 20-09-2016 | Исправлено: ASE_DAG, 08:03 20-09-2016
urodliv



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Коллеги, объясните непонимающему.
Есть файл с текстом:

Код:
    name*1*=7897985464897523fsdf.jpg
    name*1*="7897985464897523fsdf.jpg"
    name*1=7897985464897523fsdf.jpg
    name*1="7897985464897523fsdf.jpg"

Надо первую и третью строчки привести к виду:

Код:
    name=7897985464897523fsdf.jpg

А вторую и четвёртую, соответственно, к такому:

Код:
    name=7897985464897523fsdf.jpg"

Использую команду sed 's/name\*1\*{,1}\={,1}/name=some_/g', а этот подлец игнорирует квантификаторы. Куда бы его пнуть?

----------
Очень скоро еда станет совершенно безвкусной, и тогда этот недостаток придётся компенсировать хорошо развитым воображением.

Всего записей: 6695 | Зарегистр. 29-04-2009 | Отправлено: 09:57 27-09-2016 | Исправлено: urodliv, 10:00 27-09-2016
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru