Tentei por alguns dias fazer funcionar o cron em um SUSE 11.o com insucesso.
O programa (script) que desenvolvi funcionava perfeitamente como usuário root, porém no cron não funcionou.
Uma das formas de verificar o funcionamento do cron é através do comando abaixo.
tail /var/log/messages
Neste arquivo são armazendos as mensagens de execução do cron.
Programei cron através do comando:
crontab -u root -e
* * * * * date > /root/teste
Este script é executado a cada minuto. É armazenado no arquivo teste a data e hora a cada minuto.
Porém o meu script não funcionava no cron.
Após alguns testes, descobri que é necessário definir no script os arquivos com o caminho absoluto, e eu havia definido com caminho relativo.
Esta página contem informações úteis para o dia a dia de meu trabalho
terça-feira, 23 de dezembro de 2008
Extrai uma coluna de uma lista
O meu problema é extrair uma coluna de uma lista. Por exemplo, com o comando
ps -aux
recebo
root 3399 0.0 0.0 1580 612 ? S Dec22 0:00 syslogd -m 0
root 3403 0.0 0.0 1524 468 ? S Dec22 0:00 klogd -x
root 3414 0.0 0.0 1512 448 ? S Dec22 0:04 irqbalance
rpc 3432 0.0 0.0 1676 568 ? S Dec22 0:00 portmap
rpcuser 3452 0.0 0.0 1664 720 ? S Dec22 0:00 rpc.statd
root 3464 0.0 0.0 1572 400 ? S Dec22 0:00 mdadm --monitor -
root 3481 0.0 0.0 83556 604 ? S Dec22 0:00 /sbin/auditd
root 3569 0.0 0.0 7592 1916 ? S Dec22 0:01 cupsd
root 3594 0.0 0.0 3656 1572 ? S Dec22 0:00 /usr/sbin/sshd
root 3610 0.0 0.0 2136 900 ? S Dec22 0:00 xinetd -stayalive
root 3639 0.0 0.0 6100 2580 ? S Dec22 0:01 sendmail: accepti
smmsp 3648 0.0 0.0 5992 2292 ? S Dec22 0:00 sendmail: Queue r
root 3659 0.0 0.0 1568 472 ? S Dec22 0:00 gpm -t imps2 -m /
root 3669 0.0 0.0 1600 640 ? S Dec22 0:00 crond
xfs 3693 0.0 0.0 5452 3112 ? S Dec22 0:00 xfs -droppriv -da
daemon 3703 0.0 0.0 1584 580 ? S Dec22 0:00 /usr/sbin/atd
root 3735 0.0 0.1 11644 5232 ? S Dec22 0:00 /opt/fgs/www/bin/
apache 3746 0.0 0.1 11776 5328 ? S Dec22 0:00 /opt/fgs/www/bin/
apache 3747 0.0 0.1 11776 5328 ? S Dec22 0:00 /opt/fgs/www/bin/
apache 3748 0.0 0.1 11776 5328 ? S Dec22 0:00 /opt/fgs/www/bin/
root 3756 0.0 0.0 4244 1116 ? S Dec22 0:00 sh /usr/RaidMan/R
root 3760 0.5 0.4 228124 19852 ? S Dec22 9:51 ./jre/bin/java -D
root 3772 0.0 0.0 1504 432 tty2 S Dec22 0:00 /sbin/mingetty tt
root 3773 0.0 0.0 1504 432 tty3 S Dec22 0:00 /sbin/mingetty tt
root 3774 0.0 0.0 1504 428 tty4 S Dec22 0:00 /sbin/mingetty tt
root 3775 0.0 0.0 1496 424 tty5 S Dec22 0:00 /sbin/mingetty tt
root 3776 0.0 0.0 1496 424 tty6 S Dec22 0:00 /sbin/mingetty tt
Desta lista necessito retirar a segunda coluna.
Com o comando abaixo é possível obter somente as informações da segunda coluna.
ps -aux | awk '{ print $2 }'
Recebo:
3399
3403
3414
3432
3452
3464
3481
3569
3594
3610
3639
3648
3659
3669
3693
3703
3735
3746
3747
3748
3756
3760
3772
3773
3774
3775
3776
E qual a finalidade disso?
Uma utilidade para o meu dia a dia, necessito matar os processos do Postgres.
ps -aux | grep postgres: | awk '{ print $2 } ' | while read l; do echo 'kill ' $l ; done
ps -axu - lista os processos
grep postgres: - seleciona os processo postgres:
awk '{ print $2 }' - retira a segunda coluna da lista de processo
while read l - coloca na variável l o número do processo
do echo 'kill' $l - escreve no monitor o comando kill número do processo. Caso deseje realmente apagar o processo, utilize o comando do kill $l.
Ajudas de Carlos Eduardo de Andrade Brasileiro e Frederico Meireles Palma
ps -aux
recebo
root 3399 0.0 0.0 1580 612 ? S Dec22 0:00 syslogd -m 0
root 3403 0.0 0.0 1524 468 ? S Dec22 0:00 klogd -x
root 3414 0.0 0.0 1512 448 ? S Dec22 0:04 irqbalance
rpc 3432 0.0 0.0 1676 568 ? S Dec22 0:00 portmap
rpcuser 3452 0.0 0.0 1664 720 ? S Dec22 0:00 rpc.statd
root 3464 0.0 0.0 1572 400 ? S Dec22 0:00 mdadm --monitor -
root 3481 0.0 0.0 83556 604 ? S Dec22 0:00 /sbin/auditd
root 3569 0.0 0.0 7592 1916 ? S Dec22 0:01 cupsd
root 3594 0.0 0.0 3656 1572 ? S Dec22 0:00 /usr/sbin/sshd
root 3610 0.0 0.0 2136 900 ? S Dec22 0:00 xinetd -stayalive
root 3639 0.0 0.0 6100 2580 ? S Dec22 0:01 sendmail: accepti
smmsp 3648 0.0 0.0 5992 2292 ? S Dec22 0:00 sendmail: Queue r
root 3659 0.0 0.0 1568 472 ? S Dec22 0:00 gpm -t imps2 -m /
root 3669 0.0 0.0 1600 640 ? S Dec22 0:00 crond
xfs 3693 0.0 0.0 5452 3112 ? S Dec22 0:00 xfs -droppriv -da
daemon 3703 0.0 0.0 1584 580 ? S Dec22 0:00 /usr/sbin/atd
root 3735 0.0 0.1 11644 5232 ? S Dec22 0:00 /opt/fgs/www/bin/
apache 3746 0.0 0.1 11776 5328 ? S Dec22 0:00 /opt/fgs/www/bin/
apache 3747 0.0 0.1 11776 5328 ? S Dec22 0:00 /opt/fgs/www/bin/
apache 3748 0.0 0.1 11776 5328 ? S Dec22 0:00 /opt/fgs/www/bin/
root 3756 0.0 0.0 4244 1116 ? S Dec22 0:00 sh /usr/RaidMan/R
root 3760 0.5 0.4 228124 19852 ? S Dec22 9:51 ./jre/bin/java -D
root 3772 0.0 0.0 1504 432 tty2 S Dec22 0:00 /sbin/mingetty tt
root 3773 0.0 0.0 1504 432 tty3 S Dec22 0:00 /sbin/mingetty tt
root 3774 0.0 0.0 1504 428 tty4 S Dec22 0:00 /sbin/mingetty tt
root 3775 0.0 0.0 1496 424 tty5 S Dec22 0:00 /sbin/mingetty tt
root 3776 0.0 0.0 1496 424 tty6 S Dec22 0:00 /sbin/mingetty tt
Desta lista necessito retirar a segunda coluna.
Com o comando abaixo é possível obter somente as informações da segunda coluna.
ps -aux | awk '{ print $2 }'
Recebo:
3399
3403
3414
3432
3452
3464
3481
3569
3594
3610
3639
3648
3659
3669
3693
3703
3735
3746
3747
3748
3756
3760
3772
3773
3774
3775
3776
E qual a finalidade disso?
Uma utilidade para o meu dia a dia, necessito matar os processos do Postgres.
ps -aux | grep postgres: | awk '{ print $2 } ' | while read l; do echo 'kill ' $l ; done
ps -axu - lista os processos
grep postgres: - seleciona os processo postgres:
awk '{ print $2 }' - retira a segunda coluna da lista de processo
while read l - coloca na variável l o número do processo
do echo 'kill' $l - escreve no monitor o comando kill número do processo. Caso deseje realmente apagar o processo, utilize o comando do kill $l.
Ajudas de Carlos Eduardo de Andrade Brasileiro e Frederico Meireles Palma
sexta-feira, 19 de dezembro de 2008
Comando para apagar em lote
O meu problema é apagar um conjunto de arquivo por lote. Poderia ser utilizado o comando
rm *.pdf
Mas, caso existam muitos arquivos em uma pasta ou os arquivos estejam em pastas diferentes não é possível utilizar este comando.
O comando abaixo procura todos os arquivos .pdf e apaga-os.
find . -name *.pdf | while read LINHA; do rm $LINHA ; done
rm *.pdf
Mas, caso existam muitos arquivos em uma pasta ou os arquivos estejam em pastas diferentes não é possível utilizar este comando.
O comando abaixo procura todos os arquivos .pdf e apaga-os.
find . -name *.pdf | while read LINHA; do rm $LINHA ; done
quarta-feira, 19 de novembro de 2008
Busca arquivo diretorio Linux
Colaboração: Ricardo Jurczyk Pinheiro
Data de Publicação: 19 de November de 2008
Uma necessidade que tenho vez por outra, no Linux, é descobrir em que
arquivo de configuração, dentro do /etc, devo mexer. Como o /etc tem vários
diretórios, e dentro deles outros arquivos, acabei desenvolvendo uma solução
"rápida e suja", que funciona muito bem:
#!/bin/sh
#
# Pesquisa - Encontra um padrao dentro de uma lista de arquivos
# numa arvore de diretorios
# Autor: Ricardo Jurczyk Pinheiro - ricardojpinheiro@ibest.com.br
# Versao 0.000000000000000000000000000000000000000000000000000001
#
#
if [ $# -ne 2 ]; then
echo "$0 (palavra a ser procurada) (arvore de diretorios)"
exit 1
else
for nome in $(find $2 -type f | sort | uniq); do
echo $nome
cat $nome | grep $1
done
fi
E basta fazer um pipe com o less, que resolve o problema de excesso de informações na tela.
Ricardo Jurczyk Pinheiro - Linux user #82838 - http://estudiodaintrospeccao.blogspot.com
Data de Publicação: 19 de November de 2008
Uma necessidade que tenho vez por outra, no Linux, é descobrir em que
arquivo de configuração, dentro do /etc, devo mexer. Como o /etc tem vários
diretórios, e dentro deles outros arquivos, acabei desenvolvendo uma solução
"rápida e suja", que funciona muito bem:
#!/bin/sh
#
# Pesquisa - Encontra um padrao dentro de uma lista de arquivos
# numa arvore de diretorios
# Autor: Ricardo Jurczyk Pinheiro - ricardojpinheiro@ibest.com.br
# Versao 0.
#
#
if [ $# -ne 2 ]; then
echo "$0 (palavra a ser procurada) (arvore de diretorios)"
exit 1
else
for nome in $(find $2 -type f | sort | uniq); do
echo $nome
cat $nome | grep $1
done
fi
E basta fazer um pipe com o less, que resolve o problema de excesso de informações na tela.
Ricardo Jurczyk Pinheiro - Linux user #82838 - http://estudiodaintrospeccao.
terça-feira, 18 de novembro de 2008
Função em Postgres
O meu problema é transformar um campo que retorna a informação da forma:
"250077#;#251420#;#251000#;#250915#;#250840#;#251720#;#251320#;#251398#;#"
em um lista da forma:
"500625,500085,250760,250933,250050,250530,250210,250560,251430,251570,251100,250077,251420,251000,250915,250840,251720,251320,251398,251207,250205,251203,251365,251445,250720,250990,250940,250790,250980,250090,251270,251280,250937,250740,250230,250290,250280,250130,251580,251275,250250,250215,250435,250950,250120,250040,251510,352780,351670,350150,350140,311787,250270,251600,251590,250190,250270,251600,251590,250190,250960,250220,251450,250070,251330,251680,250960,250220,251450,250070,251330,251680,251560,250820,251593,250580,251272,251160,250520,250080,251150,250640,251500,"
Para resolver isso criei uma função em PostgreSQL para executar esta tarefa:
CREATE or REPLACE FUNCTION lista_mun() RETURNS varchar AS '
DECLARE
mviews RECORD;
lista varchar;
BEGIN
lista := \'\';
FOR mviews IN select replace(resposta,\'#;#\',\',\') as mun
from dados.itemquest
where pergunta=\'p_mun_ref\' LOOP
lista := lista || mviews.mun;
END LOOP;
RETURN lista;
END;
' LANGUAGE plpgsql;
Forma de utilização:
select lista_mun()
A função acima tem um problema, como comparar o texto contendo número inteiros com um número inteiro.
Assim reescrevi a função para que retornasse um vetor de inteiros:
CREATE OR REPLACE FUNCTION dados.lista_mun()
RETURNS integer[] AS
$BODY$
DECLARE
mviews RECORD;
lista varchar;
return_arr text[];
BEGIN
lista = '';
FOR mviews IN select replace(resposta,'#;#',',' ) as mun
from dados.itemquest
where pergunta='p_mun_ref' LOOP
lista := lista || mviews.mun;
END LOOP;
return_arr := '{' || lista || 0 || '}';
RETURN return_arr;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Para utilizar esta função, é necessário transformar o vetor de inteiros para número inteiros individuais:
select *
from
generate_series(1,array_upper(dados.lista_mun(),1)) as idx(i),
dados.lista_mun() as arr(a)
Onde a função
array_upper(dados.lista_mun(),1) = Retorna o tamanho do array
generate_series(1,array_upper(dados.lista_mun(),1)) = Retorna número de 1 ao tamanho do array
O uso final da função ficou assim:
select c.gid, MakePoint(c.longitudes,c.latidudese ) as the_geom
from mapas.shp_munic c
where c.ibge in
(select arr.a[idx.i]
from
generate_series(1,array_upper(dados.lista_mun(),1)) as idx(i),
dados.lista_mun() as arr(a))
"250077#;#251420#;#251000#;#250915#;#250840#;#251720#;#251320#;#251398#;#"
em um lista da forma:
"500625,500085,250760,250933,250050,250530,250210,250560,251430,251570,251100,250077,251420,251000,250915,250840,251720,251320,251398,251207,250205,251203,251365,251445,250720,250990,250940,250790,250980,250090,251270,251280,250937,250740,250230,250290,250280,250130,251580,251275,250250,250215,250435,250950,250120,250040,251510,352780,351670,350150,350140,311787,250270,251600,251590,250190,250270,251600,251590,250190,250960,250220,251450,250070,251330,251680,250960,250220,251450,250070,251330,251680,251560,250820,251593,250580,251272,251160,250520,250080,251150,250640,251500,"
Para resolver isso criei uma função em PostgreSQL para executar esta tarefa:
CREATE or REPLACE FUNCTION lista_mun() RETURNS varchar AS '
DECLARE
mviews RECORD;
lista varchar;
BEGIN
lista := \'\';
FOR mviews IN select replace(resposta,\'#;#\',\',\') as mun
from dados.itemquest
where pergunta=\'p_mun_ref\' LOOP
lista := lista || mviews.mun;
END LOOP;
RETURN lista;
END;
' LANGUAGE plpgsql;
Forma de utilização:
select lista_mun()
A função acima tem um problema, como comparar o texto contendo número inteiros com um número inteiro.
Assim reescrevi a função para que retornasse um vetor de inteiros:
CREATE OR REPLACE FUNCTION dados.lista_mun()
RETURNS integer[] AS
$BODY$
DECLARE
mviews RECORD;
lista varchar;
return_arr text[];
BEGIN
lista = '';
FOR mviews IN select replace(resposta,'#;#',',' ) as mun
from dados.itemquest
where pergunta='p_mun_ref' LOOP
lista := lista || mviews.mun;
END LOOP;
return_arr := '{' || lista || 0 || '}';
RETURN return_arr;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Para utilizar esta função, é necessário transformar o vetor de inteiros para número inteiros individuais:
select *
from
generate_series(1,array_upper(dados.lista_mun(),1)) as idx(i),
dados.lista_mun() as arr(a)
Onde a função
array_upper(dados.lista_mun(),1) = Retorna o tamanho do array
generate_series(1,array_upper(dados.lista_mun(),1)) = Retorna número de 1 ao tamanho do array
O uso final da função ficou assim:
select c.gid, MakePoint(c.longitudes,c.latidudese ) as the_geom
from mapas.shp_munic c
where c.ibge in
(select arr.a[idx.i]
from
generate_series(1,array_upper(dados.lista_mun(),1)) as idx(i),
dados.lista_mun() as arr(a))
segunda-feira, 10 de novembro de 2008
Alguns configure para POSTGRES/POSTGIS/MAPSERVER/PHP
Para o POSTGIS
./configure \
--with-pgsql=/opt/PostgreSQL/8.3/bin/pg_config \
--with-geos \
--with-proj \
Para o PHP
./configure \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-pgsql=/opt/PostgreSQL/8.3/bin \
--enable-soap \
--enable-zip \
--with-gd \
--with-jpeg-dir=/usr/local
Para o MapServer
./configure \
--with-wfs \
--with-wfsclient \
--with-wmsclient \
--with-gdal=/usr/local/bin/gdal-config \
--with-php=/usr/local/include/php \
--with-mygis=yes \
--with-postgis=/opt/PostgreSQL/8.3/bin/pg_config \
--with-proj
./configure \
--with-pgsql=/opt/PostgreSQL/8.3/bin/pg_config \
--with-geos \
--with-proj \
Para o PHP
./configure \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-pgsql=/opt/PostgreSQL/8.3/bin \
--enable-soap \
--enable-zip \
--with-gd \
--with-jpeg-dir=/usr/local
Para o MapServer
./configure \
--with-wfs \
--with-wfsclient \
--with-wmsclient \
--with-gdal=/usr/local/bin/gdal-config \
--with-php=/usr/local/include/php \
--with-mygis=yes \
--with-postgis=/opt/PostgreSQL/8.3/bin/pg_config \
--with-proj
segunda-feira, 6 de outubro de 2008
Erro de Instalação
1 - Verifique se existe a biblioteca solicitada.
cd /
find . -name libc.so*
2 - Caso exista a biblioteca o binário esta fazendo referencia a um Kernel especifico, então utilize o seguinte comando
cp Install.bin Install.bak
cat Install.bak | sed "s/export LD_ASSUME_KERNEL/#xport LD_ASSUME_KERNEL/" > Install.bin
rm Install.bak
cd /
find . -name libc.so*
2 - Caso exista a biblioteca o binário esta fazendo referencia a um Kernel especifico, então utilize o seguinte comando
cp Install.bin Install.bak
cat Install.bak | sed "s/export LD_ASSUME_KERNEL/#xport LD_ASSUME_KERNEL/" > Install.bin
rm Install.bak
Assinar:
Postagens (Atom)