Nowe posty

Autor Wątek: Przejęcie standardowego wyjścia/wejścia  (Przeczytany 5741 razy)

pasibrzuch

  • Gość
Przejęcie standardowego wyjścia/wejścia
« dnia: 2011-06-16, 07:09:41 »
Uruchamiam sobie jakiś program w tle, który chodzi w tle i przyjmuje polecenia z konsoli, oraz wysyła informacja również na konsole. Powiedzmy, że przekierowałem standardowe wyjście do pliku. Mam PID, teraz robię 'disown' i wylogowuję się
Za jakiś czas znowu się loguję, widzę że proces o takim PID jest uruchomiony, pytanie: jak przejąć jego standardowe wejście,wyjście, tak żebym mógł bez ponownego jego uruchamiania wpisać mu coś na konsolę?
Wiem, że można to zrobić przy pomocy screen, ale czy jest jakiś inny sposób, jeśli program nie jest uruchominy w screen i mam jego PID, to czy mogę przejąć jakoś jego standardowe wejście,wyjscie?

arctgx

  • Gość
Przejęcie standardowego wyjścia/wejścia
« Odpowiedź #1 dnia: 2011-06-17, 00:12:34 »
Sam z ciekawości chciałem wygospodarować trochę czasu na rozwiązanie, ale skończyło się na lekturze czegoś, co może być krokiem w dobrą stronę:

http://stackoverflow.com/questions/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-line

Ksanderon

  • Gość
Przejęcie standardowego wyjścia/wejścia
« Odpowiedź #2 dnia: 2011-06-17, 01:27:38 »
może po prostu jako wejscie do programu echo "komenda">plik  a jako wyjscie skrypt pilnujący czy data modyfikacji się zmieniła, jeśli tak to wyświetlający i czyszczący plik- myślę, że to by było bardzo proste ale skuteczne.???

chmooreck

  • Gość
Przejęcie standardowego wyjścia/wejścia
« Odpowiedź #3 dnia: 2011-06-17, 08:54:20 »
A nie można wejścia podłączyć do fifo ?
Wyjście do pliku + tail

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Przejęcie standardowego wyjścia/wejścia
« Odpowiedź #4 dnia: 2011-06-17, 12:22:29 »
Przykładowe uruchomienie basha w trybie interaktywnym bez wyjścia na terminal:

Tworzę kolejkę "/tmp/in" i przekierowuję ją do basha na stdin. Używam taila, bo inaczej bash dostawałby znak końca pliku po każdym zapisie do fifo i kończyłby działanie (komendą Ctrl+D). Tail nie wysyła znaku końca pliku.

Standardowe wyjście przekierowuję do pliku "/tmp/out".

mkfifo /tmp/in
tail -f /tmp/in | /bin/bash -i -s &> /tmp/out
Wynik działania komendy mogę czytać na osobnej konsoli.

tail -f /tmp/out
Komendy wydaję przesyłając je do kolejki.

echo "ls" >> /tmp/in
W ten sposób "/tmp/in" robi za nasze standardowe wejście, natomiast "/tmp/out" za standardowe wyjście basha.

arctgx

  • Gość
Przejęcie standardowego wyjścia/wejścia
« Odpowiedź #5 dnia: 2011-06-17, 12:34:25 »
Też ciekawe, ale zdaje się, że powłoka cały czas kontroluje tu zadanie. Sam próbuję podpinać deskryptor wejścia pod kolejkę, z innego terminala zapuścić w tło zadanie biorące coś z wejścia (np. vim), oderwać je disownem od powłoki, wysłać np. :wq! /tmp/plik i sprawdzić czy /tmp/plik powstał, jeśli nie istniał wcześniej. Na razie brak mi czasu, by uporządkować i wkleić to, co już dobrze mi działa i zapytać o resztę.

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Przejęcie standardowego wyjścia/wejścia
« Odpowiedź #6 dnia: 2011-06-17, 13:13:32 »
Cytuj
Też ciekawe, ale zdaje się, że powłoka cały czas kontroluje tu zadanie.
Nie zdaje się, tylko na pewno kontroluje, bo nie tego dotyczył przykład. Mój błąd, ale założyłem, że to oczywiste, że musi pierwszą część przykładu wyhaczyć z konsoli. Nie chciałem komplikować przykładu i pokazać tylko sposób komunikacji między procesami.

np.

nohup `nohup tail 2>&1 /tmp/out 2>&1` > /dev/null <& /dev/null 2&>1 &
zamiast

tail -f /tmp/in | /bin/bash -i -s &> /tmp/out
W sumie i tak musiałby uruchomić skrypt jako daemona, więc to raczej nie stanowi problemu.