jak zmienić katalog i proces wyłączania

0

Wiem, jak zmienić katalog:

cd path

Wiem, jak odłączyć proces:

command &, nohup command > /tmp/test_output.txt 2>&1 &, nohup command > /dev/null 2>&1 &, disown command &

oto dobre odniesienie do tego: Jak całkowicie odłączyć proces od Terminalu?

Ale nie wiem, jak je wykonać jednocześnie, wydaje się to niemożliwe. Czy ktoś może mi pomóc? Oto kilka rzeczy, które próbowałem:

path/command
nohup cd path && command > /tmp/test_output.txt 2>&1 &
cd path && nohup command > /tmp/test_output.txt 2>&1 &
cd path && disown command &
(cd path && disown command &)
(cd path && command) &
cd path ; command &

Mogę go zmusić do błędu, mogę go zmusić do przejścia do tej ścieżki i uruchomienia (ale nie odłączenia od mojego terminala) lub mogę go uruchomić, aby uruchomić polecenie odłączone od mojego terminala, ale w moim bieżącym katalogu roboczym, a nie ścieżkę cd .

Nie mogę go zmusić do odłączenia procesu od mojego terminala i uruchomienia polecenia z innego katalogu niż mój własny w tym samym czasie.

czy możesz mi z tym pomóc? Czy to możliwe?

Legit Stack
źródło

Odpowiedzi:

2

Tam są różnice pomiędzy nohup, disown i & (możesz również znaleźć ta odpowiedź ciekawy).

Składnia disown command użyłeś nieprawidłowego, przynajmniej w Bash; widzieć help disown. W niektórych przypadkach command & disown wystarczy, ale

[ command ] nadal jest podłączony do terminala, więc jeśli terminal zostanie zniszczony [...], program zawiedzie, gdy tylko spróbuje odczytać ze standardowego wejścia lub zapisać na standardowe wyjście.

Więc nohup command & wydaje się jednak lepszy

nohup nie usuwa procesu z kontroli zadań powłoki

Wydaje się to dość nieszkodliwe, ale jeśli ci to przeszkadza, po prostu disown Praca:

nohup command &
disown

Ale jeśli praca zakończy się wcześniej disown działa, a wtedy się wyrzekniesz inne praca (jeśli istnieje). Właściwym sposobem na zrobienie tego w Bash jest posługiwać się $!:

$! Rozwija się do identyfikatora procesu zadania ostatnio umieszczonego w tle

Więc to jest lepsze:

nohup command &
disown $!

(Od disown po nohup jest głównie kosmetyczny, od teraz go pominę. Użyj go, jeśli go potrzebujesz).

Do cd przed command bez wpływu na bieżącą powłokę, najlepszym sposobem jest zrobienie tego w podpowłoce (próbowałeś, ale nie z nohup ):

(cd path && nohup command) &

lub nawet

(cd path && exec nohup command) &

gdzie exec sprawia nohup zastąpić proces podpowłoki, który nie jest już potrzebny; nohup zostanie zastąpiony przez command ponieważ tak działa narzędzie. W ten sposób otrzymasz jeden proces zamiast wielu.

Alternatywnie możesz nohup cała skorupa. Umożliwia to wykonywanie wielu poleceń:

nohup sh -c 'cd path || exit; command1; command2' &

(W tym przypadku exec ma sens tylko przed command2 ).

Uwaga nohup tworzy plik nohup.out, chyba że przekierujesz jego wyjście (zobacz man 1 nohup ). Miejsce utworzenia pliku zależy od bieżącego katalogu roboczego nohup proces, więc ogólnie robi to różnicę, czy ty cd przed nohup ( cd path && nohup ... ) Albo na odwrót ( nohup sh -c 'cd path ... ' ).

Kamil Maciorowski
źródło