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.