Jak ukryć informacje o procesie powłoki podczas uruchamiania procesu w tle?

19
[USER@SERVER ~] sleep 3 &
[1] 5232
[USER@SERVER ~] 
[1]+  Done                    sleep 3
[USER@SERVER ~] 

Jak mogę / dev / null te dwie wiadomości ?:

[1] 5232
[1]+  Done                    sleep 3

ps: więc potrzebuję danych wyjściowych procesu, ale nie wspomnianych dwóch linii!

LanceBaynes
źródło
Otrzymujesz te linie tylko wtedy, gdy uruchamiasz je interaktywnie. Nie zrobisz tego, jeśli na przykład uruchomisz go ze skryptu.
derobert

Odpowiedzi:

24

To nie jest wynik programu, to kilka użytecznych informacji o powłoce.

W każdym razie można je ukryć, używając przekierowania podpowłoki i wyjścia

( sleep 3 & ) > /dev/null 2>&1
ДМИТРИЙ МАЛИКОВ
źródło
2
„2> / dev / null” to dobra rzecz, potrzebuję danych wyjściowych z procesu
LanceBaynes
@LanceBaynes Proces może również napisać coś na stderr.
Chris Down,
2
To niefortunne, że udaremnia to odzyskanie pid za pomocą $!
Deleplace
3

W bash lub zsh możesz zadzwonić, disown %1aby powiedzieć powłoce, aby zapomniała o zadaniu. Wtedy powłoka nie wydrukuje żadnej wiadomości o tym zadaniu, ani nie wyświetli jej, gdy uruchomisz jobslub kiedykolwiek wyślesz do niej SIGHUP. W zsh rozpoczęcie zadania od &!zamiast &jest równoznaczne z disownnatychmiastowym wywołaniem go.

Gilles „SO- przestań być zły”
źródło
1

Nie mogę komentować (jeszcze) @Gilles, ale wygląda na to, że & disowndziała również w bash:

sleep 3 & disown
dubberx
źródło
To nie wydaje się działać w Bash v.4.1.2
Alexej Magura
1

Próbować:

user@host:~$ read < <( sleep 10 & echo $! )
user@host:~$ echo $REPLY
28677

I ukryłeś zarówno wyjście, jak i PID . Pamiętaj, że nadal możesz odzyskać PID z $ REPLY

mark_infinite
źródło