Ficheiro Bash

o que eu me pergunto eh se o bash funciona sem crashar
'crashar' o Bash é coisa levada da breca! É mais fácil o teu script crashar que crashares o Bash.

(porque vai montar a partilha todos os dias) no ubunto, redhat, ipbrick, etc?
Eu tenho scripts que montam e desmontam discos externos de hora a hora para fazer backups em várias máquinas. De há 5 anos para cá que ainda não tive um único problema. Mas não ponho as mãos no fogo...

Nao vou por um bash a testar em servidores de producao sem ter a certeza
Fazes bem.

, ou pelo menos sem a opiniao de outras pessoas que têm muita mais experiencia em linux do que eu.
Eu não te vou dar opinião nenhuma, porque estou muito desconfiado do teu script PHP. PHP para manutenção de sistemas? isso é coisa do demo :-P
 
Última edição:
Eu não te vou dar opinião nenhuma, porque estou muito desconfiado do teu script PHP. PHP para manutenção de sistemas? isso é coisa do demo :-P

Este script em php tem q ser executavel via WEB e n ia tar a fazer o mesmo script em C pra correr no cron (2000 linhas de codigo a fazer o mesmo era demais). Mas garanto-t, o PHP ta a prova de erro.

Coisa do demo, n digas isso, eh melhor q um anjo: quando precisamos, ta sempre la pra nos ajudar, nao falha...

Mas o que me interessa mais neste momento eh a confiabilidade de fazer multiplos mount de uma partilha, visto q e mto complicado crashar um bash.

Sendo assim, vou assumir que montar multiplas vezes a mesma partilha nao constitui um entrave para o meu bash.
Quem n concordar, por favor diga-m alguma coisa.

Obrigado a todos
 
Última edição:
Sendo assim, vou assumir que montar multiplas vezes a mesma partilha nao constitui um entrave para o meu bash.
Se já está montado, porque é que vais executar o comando novamente?
Quando montas um dispositivo deves desmonta-lo quando já não precisas (se estivermos a falar de dispositivos externos ou sistemas de ficheiros remotos). Além do mais, alguns dispositivos só concluem o envio dos dados quando é dado o comando 'umount'.

Podes fazer o mount de dispositivos que já estão montados... mas isso é programação ... assim ... a modos de que.... err.... enfim... é por isso que desconfio do teu PHP ;-)

Este script em php tem q ser executavel via WEB
Queres dizer.... http://www.server.com/meuscript.php?
 
Passo a explicar o esquema todo:
Inicialmente, tinhamos um unico servidor (linux) a servir varios departamentos.
Agora, temos n servidores (linux), um por cada departamento. Em cada servidor encontra-se o meu php e o q ele faz eh "selecionar" dados de multiplos ficheiros do tipo XML.
Estes ficheiros XML encontram-se numa especie de repositorio unico num servidor Win2003 (a dita partilha a montar no linux).

Este processo anteriormente era feito manualmente correndo o PHP atraves de um gestor tipo BackOffice e o mount era verificado manualmente.

Querendo automatizar este processo, nao se ia reescrever um codigo ja existente e 100% funcional.

Nada nos garante q o servidor Win2003 possa ter q ser reiniciado por qualquer razao.
Daí o mount ser necessario sempre que se corra este processo automatizado.

Espero ter esclarecido as duvidas.

Em relacao ao q disseste: "Podes fazer o mount de dispositivos que já estão montados... mas isso é programação ... assim ... a modos de que.... err.... enfim..." - posso confiar no linux, se for montada a mesma partilha?

Obrigado mais uma vez pelas respostas.
 
Se este script resolver o teu problema, ficas a dever-me uma travessa de caracóis :-)

Código:
#!/usr/bin/perl -T
use strict;
use warnings;

$ENV{PATH} = '/usr/bin';

#
# A execucao deste script supoe a existencia de uma linha em /etc/fstab para
# definir o ponto de montagem da pasta.
# Exemplo (Samba)
# //10.0.0.1/partilha /home/myself/mount_point smbfs noauto,username=xxx,password=yyy,rw 0 0
#

if ( $< != 0 ) { print qq|Apenas o root pode executar este script!\n|; exit 0; }

my $mount_point = q|/home/myself/mount_point|;
my $php_file    = q|http://www.example.com/myfile.php|;

my $mount_command  = qq|/bin/mount $mount_point >> /dev/null 2>&1|;
my $umount_command = qq|/bin/umount $mount_point >> /dev/null 2&>1|;
my $tries = 3;    # Tentativas para montar a pasta
my $wait  = 5;    # Intervalo em seg. entre tentativas

if ( is_mounted( $mount_point, 0 ) ) { exec_php($php_file) }

exit 0;

sub is_mounted {

    my ( $pasta, $counter ) = @_;

    if ($counter > 1) { sleep $wait } # damos um tempo para ver se o servidor 'ressuscita' :)

    # Terminamos se ao fim de N tentativas nao conseguimos montar a pasta
    if ( $counter > $tries ) {
        print qq|Impossivel montar $pasta ao fim de +- |
          . ( $tries * $wait )
          . qq| segundos!\n|;
        exit 0;
    }

    use IO::File;

    # Verificamos se a pasta esta montada
    my $fh = new IO::File "/etc/mtab", "r";
    chomp( my @mounted = <$fh> );
    undef $fh;

    if ( grep { $_ =~ /$pasta/ } @mounted ) {

        # Esta montada
        return 1;

    }
    else {

        # Verificamos se o ponto de pontagem esta definido em /etc/fstab
        $fh = new IO::File "/etc/fstab", "r";
        chomp( my @mounts = <$fh> );
        undef $fh;

        if ( grep { $_ =~ /\s$pasta\s/ } @mounts ) {

            # esta definido, tentamos montar
            qx/$mount_command/;
            $counter++;
            is_mounted( $pasta, $counter );

        }
        else {

            # Nao esta definido! Terminamos com erro.
            print qq|Ponto de montagem $pasta nao definido em /etc/fstab!\n|;
            exit 0;

        }
    }

}

sub exec_php {

    my $self = shift;

    print qx|/usr/bin/lynx --dump $self|;

    umount();
    return;

}

sub umount {

    qx/$umount_command/;
    return;

}

Notas:
  1. Este script só pode ser executado como root. Podes alterar para o ID de um user que tenha permissão para executar 'mount' e 'umount';
  2. Grava o script com o nome que quiseres; depois das duas uma: ou '$ chmod +x script; $./script' ou '$ perl -T script'. Na crontab: '10 * * * * /path/to/script 1>/dev/null';
  3. Não sei o que faz o teu script PHP, mas se tiver algum output (HTML, XML, whatever) esse output é devolvido por este script Perl para o STDOUT.
  4. Eventualmente, pode sempre meter-se um timer neste script, não vá dar-se o caso de o script PHP ficar pendurado sabe deus por que razão :-)
 
Última edição:
Back
Topo