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