A resposta selecionada não funciona muito bem com várias sessões e não permite especificar um nome de arquivo de log personalizado.
Para várias sessões de tela, esta é minha fórmula:
Crie um arquivo de configuração para cada processo:
logfile test.log
logfile flush 1
log on
logtstamp after 1
logtstamp string "[ %t: %Y-%m-%d %c:%s ]\012"
logtstamp on
Se você quiser fazê-lo "on the fly", você pode alterar logfile
automaticamente.
\012
significa "nova linha", pois o uso \n
será impresso no arquivo de log: origem .
Inicie seu comando com os sinalizadores "-c" e "-L":
screen -c ./test.conf -dmSL 'Test' ./test.pl
É isso aí. Você verá "test.log" após o primeiro flush:
...
6 Something is happening...
[ test.pl: 2016-06-01 13:02:53 ]
7 Something else...
[ test.pl: 2016-06-01 13:02:54 ]
8 Nothing here
[ test.pl: 2016-06-01 13:02:55 ]
9 Something is happening...
[ test.pl: 2016-06-01 13:02:56 ]
10 Something else...
[ test.pl: 2016-06-01 13:02:57 ]
11 Nothing here
[ test.pl: 2016-06-01 13:02:58 ]
...
Eu descobri que "-L" ainda é necessário, mesmo quando "logon" está no arquivo de configuração.
Não consegui encontrar uma lista das variáveis de formato de hora (como% m) usadas pela tela. Se você possui um link desses formatos, poste abaixo.
Extra
Caso você queira fazê-lo "on the fly", você pode usar este script:
#!/bin/bash
if [[ $2 == "" ]]; then
echo "Usage: $0 name command";
exit 1;
fi
name=$1
command=$2
path="/var/log";
config="logfile ${path}/${name}.log
logfile flush 1
log on
logtstamp after 1
logtstamp string \"[ %t: %Y-%m-%d %c:%s ]\012\"
logtstamp on";
echo "$config" > /tmp/log.conf
screen -c /tmp/log.conf -dmSL "$name" $command
rm /tmp/log.conf
Para usá-lo, salve-o (screen.sh) e defina + x permissões:
./screen.sh TEST ./test.pl
... e executará ./test.pl e criará um arquivo de log em /var/log/TEST.log