LINUX.ORG.RU
ФорумAdmin

GNU Screen и bash-скрипты: непонятности


0

1

Добрый день! Появились некоторые вопросы относительно screen и bash-скриптов.

Началось всё с того, что мне надо было из php-скрипта запускать на исполнение один bash-скриптик, который создаёт screen-сессию, в которой качает очень долго большой файл вегетом.

Собственно, php-скрипт вот такой и с ним проблем нет:

Backupping... <br />
<?php
$execresult = shell_exec('../../backup/dl');
echo $execresult;
?>
Done!

Как видно из скрипта, я могу если что вывести в браузер то, что творится в консоли.

Ок, теперь то, что лежит в ../../backup/dl:

/bin/bash
screen -d -m -S backup

После того, как прогоняю в браузере php-скрипт, он рапортует Done! а я лезу в ssh и пишу screen -ls. Вот что я вижу в результате:

(10/09/2011 04:35:05 PM) (Detached)
1969.VNC (10/09/2011 01:53:45 PM) (Detached)
910.minecraft (10/09/2011 12:59:29 PM) (Detached)

Нижние два я создал сам руками ранее. А вот верхний создан скриптом. Как мы видим, он создался, но у него нет ни pid, ни названия! Как так?

Дописал в скрипт вот эту строчку: echo `screen -ls`
И снова запустил php-шник.
На этот раз я увидел:

2721.backup (10/09/2011 04:35:46 PM) (Detached)
2677.backup (10/09/2011 04:35:05 PM) (Detached)
1969.VNC (10/09/2011 01:53:45 PM) (Detached)
910.minecraft (10/09/2011 12:59:29 PM) (Detached)

Выходит скрипт всё же создаёт сессии с нужными именами и видит уже созданные! Но когда я снова зашёл в shh и написал screen -ls, то увидел

(10/09/2011 04:35:46 PM) (Detached)
(10/09/2011 04:35:05 PM) (Detached)
1969.VNC (10/09/2011 01:53:45 PM) (Detached)
910.minecraft (10/09/2011 12:59:29 PM) (Detached)

То есть почему-то из bash-скрипта видно как созданные им сессии, так и не им созданные. А из обычного терминала созданные скриптом показаны как непонятно что.

Ладно, думаю, раз скрипт сам видит свои сессии, может, он сможет и заставить их исполнять команды? Убираю все «кривые» сессии, добавляю в конец строчку:

screen -S backup -X exec wget -O /home/abtomat/servers/backup/backup-$(date +%Y-%m-%d).txt http://neochan.ru/backup/test.txt

И... ничего не происходит. Так как я из терминала не могу законнектиться к этим сессиям, я не могу понять, что происходит. В то же время, если в терминале написать:

screen -d -m -S test
screen -S test -X exec wget -O /home/abtomat/servers/backup/backup-$(date +%Y-%m-%d).txt http://neochan.ru/backup/test.txt

То заветный файлик скачивается и появляется где ему подобает.

Кодировка bash-скрипта utf-8 (cp1251 приводила ровно к такому же результату) да и русских букв там нет.
Народ, объясните, почему так происходит? Может, я чего-то не понимаю?

Ответ на: комментарий от true_admin

Спасибо! Не знал про существование tmux.
Но всё же хотелось бы узнать, ЧЯДНТ со скрином, хотя бы из любопытства.

ABTOMAT ()
Ответ на: комментарий от baverman

чё с tmux не так? Возможностей больше, управление гораздо более очевидное, недостаток я пока только один заметил: не умеет различные кодировки для разных окон. Но мне это уже давно не актуально.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

К тмуксу претензий никаких нет. Просто не покидает ощущение, что ТС сильно окольным путем решает проблему.

baverman ★★★ ()
Ответ на: комментарий от baverman

Ну, собственно могу изложить проблему.

Есть два сервера, например С1 и С2.
На С1 по крону срабатывает скрипт - делание бекапа.
Делается бекап в виде zip-файла, кладётся в расшаренную по http-папку.
После этого С1 выполняет вегет: http://C2/downloadbackup.php
На С2 выполняется downloadbackup.php (суть его - просто запустить баш-скрипт)
Он создаёт сессию скрина (чтоб я мог зайти и поглядеть сколько % скачано, по идее, это необязательно) и в ней вегетом же выкачивает бекап с С1.
После этого вегетом делает http://C1/removebackup.php
На С1 выполняется removebackup.php, который удаляет архив с бекапом.

Если предложите менее костыльное решение, буду только рад.
Суть - заставить С2 скачать backup.zip с С1 и потом чтоб С1 удалил backup.zip.

ABTOMAT ()
Ответ на: комментарий от ABTOMAT

Если предложите менее костыльное решение, буду только рад.

По-моему, любой другой способ будет менее костыльным. Rsync, ftp, scp, smb. Тысячи их.

provaton ★★★★★ ()
Ответ на: комментарий от provaton

А какая разница по какому протоколу гонять файлы? Тем более что http уже есть, а всё остальное ещё надо настраивать непонятно ради чего.
Кроме того, ну, хорошо, стал я, например, скачивать вторым сервером с первого по ftp. Стало менее костыльно?

ABTOMAT ()
Ответ на: комментарий от ABTOMAT

> Кроме того, ну, хорошо, стал я, например, скачивать вторым сервером с первого по ftp.

Зачем скачивать? ftp, в отличии от http, может нормально закачивать большие файлы. В случае с фтп не нужно будет такой черезжопной синхронизации между серверами.

provaton ★★★★★ ()
Ответ на: комментарий от ABTOMAT

1) man ssh-keygen; создать ключи на C2
2) скопировать публичный ключ на C1
3) по крону на C2 запускать:

ssh user@C1 'zip /path/to/zipfile.zip ...'
scp user@C1:/path/to/zipfile.zip
ssh user@C1 'rm /path/to/zipfile.zip'

вместо scp можно и wget с сохранением логов в определённом месте - тоже будет видно, сколько процентов скачалось

Slavaz ★★★★★ ()
Ответ на: комментарий от ABTOMAT

> Я имел в виду, в случае чего, с С2 можно будет творить что взбредёт и на С1.

ну если нет доверия между хостами, то всегда можно усилить безопасность через SeLinux, LIDS, AppArmor. Либо просто написать свой исполняемый файл, который будет принимать ровно два аргумента: archive и remove; указать этот файл в качестве login shell'а для пользователя. По этим командам будет собран zip-файл в определённом месте либо удалён из этого определённого места. Тогда вызова на C2 будут примерно такими:

ssh user@C1 'archive'
scp user@C1:/path/to/zipfile.zip
ssh user@C1 'remove'

Я такое не делал, но если бы стояла подобная задача (и под рукой не было бы SeLinux), то сделал бы примерно такой свой 'shell' :)

Slavaz ★★★★★ ()
Ответ на: комментарий от Slavaz

да, scp вероятно при самопальном шелле не сработает. wget вместо него.

Slavaz ★★★★★ ()

Для каждой сессии screen создаёт unix-сокет (файл). Посмотрите, может у вас прав на него не хватает.

mky ★★★★★ ()

Всем спасибо, наладил! Самое простое оказалось сделать всё же через FTP. Не сразу догнал, что заливать по FTP очень удобно.
Поднял proftpd на С2 и создал отдельный FTP-аккаунт только для этих целей. Проверил - всё делает как надо, за собой «подтирает» архив.
Осталось только в кронтаб прописать.

ABTOMAT ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.