Newsgroup: it.comp.os.linux.iniziare
Titolo: output di un comando in background

$ grep -r abc /mnt/ &
 
Siccome il comando impiega un po' di tempo per fare la ricerca, come 
vedete dalla & finale, è stato avviato in background.
 
Domanda...
 
Quando la ricerca è stata completata, come faccio a recuperare l'output?

 Quando la ricerca è stata completata, come faccio a recuperare l'output?
$ grep -r abc /mnt/ > risultato.txt &
e quindi:
cat risultato.txt
forse ?

il giorno Thu, 1 Dec 2022 11:27:56 +0100
SupaPlex <old@gamer.s> ha scritto:

buon pomeriggio, 
 
hai provato ad utilizzare il comando fg (foreground)? dovrebbe fare al caso tuo.
di risorse online che ne spiegano il funzionamento ce ne sono molte, questa [1] è un
esempio.
ad ogni modo una breve ricerca con le keyword "foreground background process"
dovrebbe fugare altri eventuali dubbi.
 
[1] 
https://www.baeldung.com/linux/foreground-background-process
 
 
saluti.
 
-- 
◈   [WinterMute] @ [debian «---» bookworm | testing]   ◈
 

Il 01/12/22 12:10, cb ha scritto:

Si ok.
Però pensavo che da qualche parte ci fosse un apposito buffer... un 
canale(i) dove viene convogliato l'output(s) dei processi in background.

 [1] 
https://www.baeldung.com/linux/foreground-background-process
 
 
Non ho trovato granchè...
 
 

 [...]
 
quando esegui un processo inviandolo in background ad esso viene associato un numero
che può essere visualizzato con jobs e richiamato con fg.
 
nell'esempio che hai riportato ovviamente il numero associato al processo in
background è 1 (essendocene uno soltanto).
a quel punto puoi "richiamarlo" usando: 
 
$ fg %1


 [...]
 
p.s.: comunque nel link di esempio che ho inserito in precedenza ci sono tutte le
varie info riguardo i comandi bg (background), jobs e fg (foreground).
 
saluti.


 
 
 
$ cat xyz
---abc---
 
$ grep abc * &
[1] 123184
---abc---
[1]+  Completato              grep --color=auto abc *
 
$ fg %1
bash: fg: %1: job inesistente
 
Perchè naturalmente il lavoro è già concluso, ovviamente.
A me però interessava sapere se c'è un modo (un device [1]) per 
recuperare l'output (senza ad es. aggiungere *> my-outpt.txt*)
 
[1] ad es. /dev/stdout-background

 [1] ad es. /dev/stdout-background
 
Se l'uscita è il terminale l'output finisce sul terminale in fg, come è 
successo anche nei tuoi esempi, puoi mandarlo ad un altro terminale 
volendo, se (forse) interferisce con quello che stai facendo, ma è poco 
diverso da salvarlo su un file
esempio, supponendo di essere su tty 2:
ping num.inv.ent.ato > /dev/pts/1 &
 
e vedi il risultato sull' 1.
 
Tu però mi sa vorresti una sorta di log degli output non un 
/dev/stdout-background, che non credo ci sia, però ti hanno già spiegato 
  come ottenerlo.
 

Addi' 01 dic 2022 10:27:56, SupaPlex scrive:

Te lo trovi tutto nel file che gli dici tu, cosi':
$ grep -r abc /mnt/ 1>/tmp/pippo &
ciao
 
-- 
Yoda
 

Il 01/12/22 15:29, SupaPlex ha scritto:

I canali di I/O dei processi in background sono sempre il terminale dal 
quale il processo è stato lanciato.  E quindi quando il grep scriverà 
qualcosa lo vedrai sul terminale del quale è un job:
 
 
[alessandro@wkstn03 ~]$ ( sleep 5 ; grep alessandro /etc/passwd ) &
[1] 15293
[alessandro@wkstn03 ~]$ alessandro:x:1000:1000:Alessandro 
Selli,,,:/home/alessandro:/bin/bash
 
[1]+  Completato              ( sleep 5; grep --color=auto alessandro 
/etc/passwd )
[alessandro@ayu ~]$
 
Se però il terminale fosse chiuso, il processo in background si 
ritroverebbe privo di dispositivo di I/O, e quindi le sue eventuali 
operazioni di scrittura o di lettura da tty genereranno un errore e i 
dati sarebbero persi.
 
Per evitare questa perdita di dati il comando deve essere eseguito con i 
file descriptor desiderati (l'output in questo caso) rediretti verso un 
dispositivo che sarà accessibile anche a terminale chiuso, come un file. 
  Se il processo è già stato lanciato però non c'è niente da fare: se si 
chiude il terminale i suoi dati saranno persi.
 
 
   Ciao,
 
 
Alessandro Selli
 

Il 01/12/22 20:34, Fabio ha scritto:

ok grazie delle info


l'output ce l'hai sempre sulla console, sia che lo mandi in bg che in fg. 
quindi lo vedrai comparire sulla stessa console da dove l'hai lanciato. 
 
occhio che non puoi chiudere la console mentre c'è un processo in bg in 
esecuzione perché questo verrebbe terminato. se è questo che vuoi fare 
devi usare un terminal multiplexer come screen o tmux che ti consente di 
"staccare" la sessione e recuperarla in un secondo momento. ma questo ha 
molto senso se il long runing task è lanciato su una sessione remota, in 
locale per me ha poco senso anche lanciarla in bg, tanto se ti serve la 
sessione per lavorare ne puoi sempre aprire un'altra.


- nohup <comando> &
  (stderr, stdout vanno a finire nel file nohup.out)
 
- nohup <comando>  >  <nome che ti piace> &
  (stderr, stdout vanno a finire nel file >nome che ti piace>)
 

Il 06/12/22 04:44, Mario M. Macaluso ha scritto:

grazie anche per questi suggerimenti