Команды Bash выдают дополнительную информацию, которая приводит к проблемам со скриптами
Хорошо, надеюсь, я смогу объяснить это правильно, так как понятия не имею, что является причиной этого или как решить эту проблему.
По некоторым причинам команды bash (на сервере CentOS 6.x) отображают больше информации, чем "обычно", и это вызывает проблемы с некоторыми сценариями. Я понятия не имею, есть ли название для этого, но, надеюсь, кто-то знает решение для этого.
Первый пример
Правильный / хороший сервер:
[root@goodserver ~]# vzctl enter 3567
entered into CT 3567
[root@example /]#
(это правильное поведение)
Неверный / плохой сервер:
[root@badserver /]# vzctl enter 3127
Entering CT
entered into CT 3127
Open /dev/pts/0
[root@example /]#
С "плохим" сервером он будет отображать больше информации, как обычно, например:
- Ввод CT
- Открыть /dev/pts/0
Это как разбор дополнительной информации о том, что он делает.
Разумеется, вышесказанное является чисто косметическим, однако, с помощью нескольких скриптов bash, которые мы используем, эти проблемы действительно являются проблемами.
Часть скрипта, которую мы используем, использует следующую команду (их больше, но в основном это пример того, что не так):
DOMAIN=`vzctl exec $VEID 'hostname -d'`
Результат вышеупомянутой информации анализируется в /etc/named.conf.
На ХОРОШЕМ сервере это будет добавлено в named.conf следующим образом:
zone "example.com" {
type master;
file "example.com";
allow-transfer {
200.190.100.10;
200.190.101.10;
common-allow-transfer;
};
};
Выше это правильно.
На BAD- сервере это будет добавлено в named.conf следующим образом:
zone "Executing command: hostname -d
example.com" {
type master;
file "Executing command: hostname -d
example.com";
allow-transfer {
200.190.100.10;
200.190.101.10;
common-allow-transfer;
};
};
Таким образом, это добавляет материал действия, которое он делает, в этом примере "Выполнение команды: hostname -d"
Другой пример, когда я запускаю команду на хорошем сервере и на плохом сервере.
Плохой сервер:
[root@bad-server /]# DOMAIN=`vzctl exec 3333 'hostname -d'`
[root@bad-server /]# echo $DOMAIN
Executing command: hostname -d example.com
Хороший сервер:
[root@good-server ~]# DOMAIN=`vzctl exec 4444 'hostname -d'`
[root@good-server ~]# echo $DOMAIN
example.com
Мои знания ограничены, но я пробовал несколько вещей, проверяя rsyslog и grub.conf, но ничто не кажется необычным.
Я понятия не имею, почему он отображает дополнительную информацию.
Возможно, это что-то простое / глупое, но я пытаюсь решить эту проблему часами, и у меня нет никакой подсказки...
Так что любая помощь действительно ценится.
Дополнительная информация: Оба сервера используют: kernel.printk = 7 4 1 7 (не знаю, полезно ли это)
2 ответа
Что ж (спасибо Аарону за то, что он указал мне правильное направление), я наконец нашел маленького преступника, который вызывал все проблемы, с которыми я столкнулся при работе со сценарием (который работал для любого другого сервера, поэтому нет необходимости менять это, очевидно).
Проблемы были вызваны набором VERBOSE leven в vz.conf (находится в каталоге /etc/vz/). Там есть опция под названием "VERBOSE", и в моем случае она была установлена на 3.
Согласно веб-сайту OpenVZ это делает следующее:
Increments logging level up from the default. Can be used multiple times.
Default value is set to the value of VERBOSE parameter in the global
configuration file vz.conf(5), or to 0 if not set by VERBOSE parameter.
После того, как я изменил VERBOSE=3 на VERBOSE=0, мой скрипт снова заработал нормально (как и для любого другого сервера).:-)
Итак, большой привет Аарону, который указал мне правильное направление. Ответ прост, если вы знаете, где искать!
Извините, но я разочарован реакцией ndim. Это второй раз, когда он был очень бесполезным и грубым в своем ответе после этого. Он явно не прочитал проблему, которую я отправил правильно. Ну что ж.
Я бы удостоверился, что правильно проанализировал вывод команды. В этом случае нас интересуют только линии вида
entered into CT 12345
Один из способов сделать это - передать все через sed
и имея sed
печатать только число, когда строка выглядит так, как указано выше (не проверено, и я всегда забываю, какие скобки / скобки / скобки нуждаются в обратной косой черте перед ними):
whateverthecommand | sed -n 's/^entered into CT ([0-9]{1,})$/\1/p'