Jak wykonać kod w nowej sesji tmux - z bieżącej sesji?

13

Korzystam z Ubuntu 16.04 i potrzebuję następującego tmuxrozwiązania, ponieważ chcę uruchomić proces przekroczenia limitu czasu, sleepponieważ w moim szczególnym przypadku nie byłem zadowolony ati napotkałem błąd nohup(podczas łączenia nohup-sleep). Teraz tmuxwydaje się najlepszą alternatywą, ponieważ ma własny mechanizm bez zawieszania się i działa właściwie w trybie ręcznym (zadaję pytanie tylko w zakresie automatyzacji procesu, który mogę już z nim zrobić ręcznie).

Czego potrzebuję:

Potrzebuję sposobu na wykonanie następujących 3 akcji, wszystkie w jednej operacji:

  1. Dołączanie nowej tmuxsesji.
  2. Wstrzyknięcie gotowego zestawu poleceń do tej sesji, np (sleep 30m ; rm -rf dir_name ; exit). Szczególnie wolałbym zestaw wieloliniowy, a nie jeden długi rząd.
  3. Wykonanie powyższej komendy ustawia moment, w którym zakończy się zapisywanie jako stdin w nowej tmuxsesji.

Innymi słowy, chcę wykonać zestaw kodu w innej tmuxsesji, która została specjalnie stworzona dla tej przyczyny, ale aby zrobić wszystko w jednej operacji.


Uwagi:

  • Staram się robić wszystko z mojej oryginalnej sesji roboczej (tej, którą pracuję przez większość czasu). Zasadniczo nie mam zamiaru odwiedzać nowo utworzonej sesji, chcę ją tylko utworzyć z automatycznie wykonywanym kodem i to wszystko.

  • Jeśli to możliwe, wolałbym rozwiązanie heredoc. Myślę, że to najbardziej wydajne.

JohnDoea
źródło

Odpowiedzi:

18

Jeśli wstawisz np. Kod, który chcesz wykonać /opt/my_script.sh, bardzo łatwo jest zrobić to, co chcesz:

tmux new-session -d -s "myTempSession" /opt/my_script.sh

Spowoduje to uruchomienie nowej odłączonej sesji o nazwie „myTempSession”, wykonującej skrypt. Możesz później dołączyć do niego, aby sprawdzić, co robi, wykonując tmux attach-session -t myTempSession.

To moim zdaniem najbardziej proste i eleganckie rozwiązanie. Nie znam żadnego łatwego sposobu wykonywania poleceń ze standardowego wejścia (czytaj „z heredoksu”) za pomocą tmux. Hakowanie może nawet być w stanie to zrobić, ale nadal byłby (i wyglądałby) hack.

Na przykład, oto hack, który używa polecenia, które zasugerowałem powyżej, aby zasymulować pożądane zachowanie (= wykonać kod w nowej sesji tmux z heredoc. Brak zapisu na dysku twardym serwera, ponieważ tworzony jest plik tymczasowy /dev/shm, który jest a tmpfs):

(
  cat >/dev/shm/my_script.sh &&
  chmod +x /dev/shm/my_script.sh &&
  tmux new-session -d '/dev/shm/my_script.sh; rm /dev/shm/my_script.sh'
) <<'EOF'
    echo "hacky, but works"
EOF
Mario Vitale
źródło
1
Drogi Mario. Zawsze przyjemnie czytam twoje odpowiedzi. Nie jestem pewien, czy rozumiem poprawnie, proszę mi powiedzieć, jeśli się mylę: 1.Istnieją dwa sposoby, aby to zrobić, jeden obejmuje najpierw utworzenie skryptu tymczasowego (zawierającego kod) i wykonanie go wraz z tworzeniem, a drugi to heredoc droga. 2.Jeśli drugi sposób działa (gdy każdy wiersz echa zawiera każdy wiersz kodu heredoc), dlaczego powinniśmy postrzegać to jako hack, jeśli jest to poprawny kod Bash? Może dlatego, że wiersze heredoka są powtarzane echem i nie są wykonywane regularnie w heredocach?
JohnDoea
2
@Benia To hack, ponieważ działa tylko na niektórych systemach Unix, które mają /dev/shm. Jest to również hack, ponieważ jest bardziej skomplikowany, trudny do odczytania, zrozumienia i utrzymania niż pisanie skryptu do zwykłego pliku i rozpoczynanie go od tmux.
Kusalananda
1
Jak wyjaśnił @Kusalananda, heredoki do wykonywania kodu są ogólnie złą praktyką. Choć jest brzydka i niemożliwa do utrzymania, działa, ale zmusza cię do znalezienia sposobu na robienie bardzo prostych rzeczy ... po prostu porównaj pierwszy i drugi blok kodu w odpowiedzi: czy możesz powiedzieć, jak to działa? Jak długo to trwa? To jeszcze bardziej hack, ponieważ tmux nie ma możliwości wykonywania poleceń ze standardowego wejścia (z wyjątkiem jeszcze bardziej hackerskich sposobów, tak brzydkich, że nawet nie będę rozważał), więc zewnętrzne skrypty są jedynym1. sposobem (odpowiedź na twoje pytanie) .
Mario Vitale,
1
Niestety, w pierwszej próbce wystąpił błąd (polecenie „nowa sesja” nie jest sugerowane, jeśli używasz argumentów). Teraz jest naprawione.
Mario Vitale
1
Teraz, kiedy wykonuję tmux new-session -d -s "myTempSession" /opt/my_script.sh, nie otwiera mi pliku tymczasowego do wklejenia kodu ... Potrzebne mi jest otwarcie skryptu bezpośrednio z bieżącej sesji lub przynajmniej przejście do nowej sesji, a następnie bezpośrednie przejście do obecna sesja. BTW Planuję przyznać nagrodę za całą twoją pomoc, ponieważ to co najmniej mogę zrobić, aby ci podziękować i mógłbym dać nagrodę za 11 godzin.
JohnDoea