Como iniciar um script bash em outro?

1

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

    
por RaspDealer 30.03.2014 / 15:37

5 respostas

1

Tente isto:

#!/bin/bash
cd "$(dirname "$0")"
# rest of script goes here
# ...
    
por 30.03.2014 / 16:22
1

Existem dois problemas com o seu código BASH:

  1. você usa o sudo que requer autenticação, algo que o Deluge Execute provavelmente não pode fazer (eu não conheço Deluge.)
  2. você usa & que explicitamente inicia seu comando em um subshell com seu próprio ambiente.

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.

    
por 30.03.2014 / 16:41
1

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
    
por 30.03.2014 / 16:22
0

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 .

    
por 27.04.2014 / 22:37
0

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

comentários

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 é ?

2

tente 1: adicione sleep 15 no final do primeiro script, test.sh.
Tente 2: adicione nohup antes do gksu. Ou seja, nohup gksu bash ...

    
por 26.04.2014 / 12:08