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!


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

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.


1

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

sleep 3 & disown

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.