Tente isto:
#!/bin/bash
cd "$(dirname "$0")"
# rest of script goes here
# ...
Estou tentando iniciar um script bash de outro usando o sudo.
Aqui está meu primeiro roteiro test.sh
#!/bin/bash
echo "test.sh" $1 $2 $3 >>/home/pi/test.log
sudo ./temp.sh "$1" "$2" "$3" >>/home/pi/test.log &
echo "test.sh done!" >>/home/pi/test.log
Quando eu corro
./test.sh a b c
no meu console, funciona. O segundo script é lançado com args! Mas quando o primeiro script é iniciado a partir de outras ferramentas (o plugin Deluge Execute), o segundo script nunca é iniciado. Parece um problema com permissões.
Atualização: Eu renomeio o segundo script para temp.sh e ele faz um eco em um segundo arquivo
#!/bin/bash
torrentid=$1
torrentname=$2
torrentpath=$3
echo " Details: " $torrentid $torrentpath $torrentname >> /home/pi/temp.log
Funciona quando iniciado pela linha de comando, mas não pelo Deluge.
Atualização 2: O segundo script é o lançamento voluntário em um segundo shell / env com & porque vai fazer uma ação longa. Eu faço isso porque quando um script é iniciado & executado pelo plugin deluge, o dilúvio é congelado durante a execução. Então eu preciso de um script que lance um segundo em segundo plano.
Atualização 3:
meu usuário pi como já pi ALL=(ALL) NOPASSWD: ALL
no arquivo visudo
Tente isto:
#!/bin/bash
cd "$(dirname "$0")"
# rest of script goes here
# ...
Existem dois problemas com o seu código BASH:
Para corrigir 1. você tem duas opções. Você pode tornar o usuário do Deluge um sudoer e fazer eco da senha no sudo como echo $PASSWORD | sudo -S <command>
ou criar uma regra apropriada no arquivo sudoers para permitir que o usuário do Deluge execute esse comando sem autenticação. Leia a man-page do sudo para mais informações.
Para corrigir 2. basta remover o "&" símbolo e considere o uso do comando interno source
. Leia a página de manual do BASH para mais informações.
Um problema definitivo com
sudo ./sort.sh "$1" "$2" "$3" & >>/home/pi/test.log
é que você tenta redirecionar a saída após , fazendo com que o script seja executado em segundo plano. Note que &
também funciona como um separador de comandos, então você está essencialmente executando os seguintes dois comandos:
sudo ./sort.sh "$1" "$2" "$3" &
>>/home/pi/test.log
Você precisa corrigir a ordem dos dois. Diga:
sudo ./sort.sh "$1" "$2" "$3" >>/home/pi/test.log &
Outro problema é que você especifica um caminho relativo para o segundo script. Substitua ./temp.sh
no script pelo caminho absoluto ou prefixe-o com o diretório que contém o script
"$(dirname "$0")"/temp.sh
Outra questão é que dois comandos
( sudo ./temp.sh "$1" "$2" "$3"
e echo "test.sh done!"
) são
escrevendo no mesmo arquivo ( /home/pi/test.log
) simultaneamente (ou seja, simultaneamente),
porque o temp.sh
(se for executado) tem o arquivo aberto em segundo plano quando o echo
é executado.
Este não deve ser um grande problema - não deve impedir que temp.sh
seja executado -
mas se você resolver o problema principal e obter temp.sh
para ser executado e gravar saída,
então provavelmente irá sobrescrever a mensagem "test.sh done!"
.
Por outro lado, se temp.sh
for executado com rapidez suficiente,
então o echo
poderia substituir os primeiros 14 bytes de saída de temp.sh
.
Experimente os scripts modificados.
Test.sh
#!/bin/bash
cd "$(dirname "$0")"
echo "test.sh $1 $2 $3" >>/home/pi/test.log
gksu bash ./temp.sh "$1" "$2" "$3" >> /home/pi/test.log &
echo "test.sh done!" >>/home/pi/test.log
temp.sh
#!/bin/bash
torrentid="$1"
torrentname="$2"
torrentpath="$3"
echo "Details: $torrentid $torrentpath $torrentname" >> /home/pi/temp.log
Se gksu
não estiver disponível, use pkexec
gksu
é a interface gráfica de sudo
. Apenas tente sudo gedit
e gksu gedit
. Sudo removido da versão mais recente do Ubuntu. Você tentou o roteiro? Como é ?
tente 1: adicione sleep 15
no final do primeiro script, test.sh.
Tente 2: adicione nohup
antes do gksu. Ou seja, nohup gksu bash ...
Tags bash linux raspberry-pi