Uruchom program z ekranem GNU i natychmiast odłącz po nim

27

Próbuję wymyślić, jak napisać skrypt, który uruchamiałby program (y) w sesjach ekranowych GNU podczas uruchamiania systemu. Próbuję tego:

#!/bin/bash
screen -S test -d -m -X $HOME/folder/folder/.program \
screen -S test2 -d -m -X $HOME/folder/folder/.program2 \

ale polecenie nie może zostać wykonane, ponieważ sesja jest już odłączona? Jedyne, czego potrzebuję, to uruchomić polecenie w sesji ekranowej i natychmiast odłączyć tę sesję.

Dzięki za odpowiedzi, ale teraz napotkałem inny problem. Skrypt przestaje działać po wstawieniu zmiennych do mojego „programu i programu2”. Coś takiego:

#!/bin/bash
screen -S test -d -m $HOME/folder/folder/.program -f config.cfg

z jakiegoś powodu „-f config.cfg” zostało zignorowane. Próbuję również zacytować polecenie i też nie pomaga.

TbMa
źródło
Dlaczego ta -Xopcja?
enzotib

Odpowiedzi:

34

Czy naprawdę chciałeś umieścić \na końcu linii? Jeśli nie, spróbuj je usunąć - uciekają przed następującą postacią.

upuszczenie pomocy -Xpomaga mi w instalacji, na przykład:

screen -S test -d -m -X touch /tmp/test

nie udaje się No screen session foundjednak z:

screen -S test -d -m touch /tmp/test

działa w porządku. Podejrzewam, że następujące działania będą dla ciebie działać:

#!/bin/bash
screen -S test -d -m $HOME/folder/folder/.program
screen -S test2 -d -m $HOME/folder/folder/.program2

Pamiętaj, że jeśli uruchomisz to podczas rozruchu, $ HOME nie będzie taki sam jak po zalogowaniu się jako konkretny użytkownik. Jeśli musisz uruchomić go jako określony użytkownik, musisz użyć takich jak, suaby uruchomić go jako ten użytkownik, a określenie pełnej ścieżki usunie wszelkie niejasności:

#!/bin/bash
screen -S test -d -m su - username /home/username/folder/folder/.program
screen -S test2 -d -m su - username /home/username/folder/folder/.program2

Lub nazwałbyś cały skrypt powyżej jako su - username /path/to/your/script.

Cry Havok
źródło
Dzięki za odpowiedzi, ale teraz napotkałem inny problem. Skrypt przestaje działać po wstawieniu zmiennych do mojego „programu i programu2”
TbMa
To: screen -S test -d -m $HOME/folder/folder/.programprawie robi dokładnie to, czego szukam, chyba że folder / .program jest zakończony, sesja ekranowa jest automatycznie zamykana. Czy jest jakiś sposób na utrzymanie sesji ekranowej (powłoki) nawet po zakończeniu programu? Może zamiast uruchamiać program wyłącznie, uruchom powłokę, która uruchamia program, a następnie powraca do znaku zachęty powłoki, czy coś takiego?
RocketNuts,
4

Jak wspomniano Cry Havok, możesz umieścić program bezpośrednio w wierszu poleceń.

Jeśli naprawdę musisz użyć opcji -X, a) musisz określić polecenie „screen” ib) sesja musi istnieć wcześniej.

screen -dmS test
screen -S test -X screen $HOME/folder/folder/.program
screen -dmS test2
screen -S test2 -X screen $HOME/folder/folder/.program2
Arcege
źródło
Jeśli umieścisz program w wierszu polecenia, ekran zostanie zamknięty po wyjściu z programu; Nie widzę flagi wiersza polecenia, aby utrzymać ekran otwarty, jeśli chcesz zobaczyć dane wyjściowe konsoli. Jeśli uruchamiasz ekran i wysyłasz polecenia osobno, jak pokazano tutaj, możesz potrzebować jawnych sleeppoleceń, aby dać ekranowi czas na rozpoczęcie sesji przed wysłaniem polecenia.
Chinasaur,
Ta odpowiedź jest bardzo podobna do odpowiedzi stackoverflow.com, która odpowiada na podobne pytanie . Wolę tę odpowiedź bardziej niż @CryHavok, ponieważ ta odpowiedź uruchamia program w domyślnej powłoce użytkownika (@CryHavok uruchamia program bez powłoki nadrzędnej, więc gdy program umrze lub ctrl-c to sesja ekranowa zostanie natychmiast przerwana)
Trevor Boyd Smith