2016-11-24 8 views
0

Ich schrieb ein Shell-Skript, um alle ausgesetzten Prozesse wieder aufzunehmen. Nach einer Forschung über die Befehle, das ist, was ich jetzt habe:Shell-Skript, um gestoppte Prozesse wieder aufzunehmen

#!/bin/bash 
for i in `jobs -sp`; do 
    kill -CONT $i 
done 

Aber nichts zu passiert scheint ... ich ein Dummy-Shell-Skript erstellt, das für immer Schleifen, runned und stoppte es. Und nachdem mein Shell-Skript ausgeführt wurde, wird es nicht fortgesetzt. Warum passiert dies?

+0

Warten sie auf die Standardeingabe? Warum sind sie suspendiert? Führen Sie 'jobs -l' aus. – Jdamian

+0

Dieses Dummy-Programm ist suspendiert, weil ich Kill-STOP genannt habe. Bearbeitete meine Frage, um dies zu berücksichtigen. –

Antwort

0

Sie müssen set -m verwenden Jobsteuerung in einem Shell-Skript zu verwenden, finden Sie Why can't I use job control in a bash script?

Hier ist meine Lösung:

set -m 

while read i 
do 
    kill -CONT $i 
done < <(jobs -sp) 

I Prozess Substitution statt Backticks verwenden.

+0

Also gibt es keine Möglichkeit, es in einem Skript zu tun? Weil ich deine Lösung an einem Skript ausprobiert habe und es nicht funktioniert hat. –

+0

Hast du das 'set -m' im Skript gemacht? – cdarke

+0

Ja, ich habe genau wie Sie vorgeschlagen .. –

0

Das Ausführen eines Skripts startet eine Subshell, die offensichtlich keine angehaltenen Jobs hat, weil Sie sie gerade gestartet haben.

Versuchen Sie, Ihren Code stattdessen in eine Funktion zu setzen und in der Shell auszuführen, in der Sie diese Jobs fortsetzen möchten.

cont() { 
    local i 
    for i in $(jobs -sp); do 
     kill -CONT $i 
    done 
} 

(Beachten Sie die Präferenz für $(...) über `...` - es ist nicht viel Unterschied macht, aber Sie sollten die modernen Syntax, wenn es nicht egal bevorzugen lernen.)

Der Code ist so einfach, dass es keinen Sinn macht, es in eine Funktion zu stellen. Sie können weiter vereinfachen mit xargs:

jobs -sp | xargs kill -CONT 
Verwandte Themen