Vraag Maak een scherm en voer de opdracht uit zonder te koppelen


Ik ben bezig met het automatiseren van een onderhoudsroutine waarbij een script wordt gestart en gestopt dat in een schermsessie wordt uitgevoerd. Mijn aanpak is om de schermsessie te beëindigen en vervolgens opnieuw op te starten en de opdracht vanuit een script uit te voeren met behulp van de mogelijkheden om zowel een scherm te maken en een opdracht door te geven zonder aan het scherm te hoeven koppelen.

Ik heb hier echter problemen mee. Ik kan het scherm correct maken zonder dat het wordt gekoppeld via screen -d -m -S screen_name. Als ik echter een opdracht voer, gebaseerd op:

screen -S screen_name-X stuff "command 1"'echo -ne '\015''"command 2"'echo -ne '\015''

waarbij de echo -ne '\ 015' wordt omwikkeld met backticks in plaats van enkele aanhalingstekens. Het is om de gebruiker te simuleren door op de enter-toets te drukken terwijl de commando's die ik gebruik naar een map gaan en daar een script uitvoeren. Deze opdracht werkt, maar alleen als het scherm is gekoppeld aan wanneer het eenmaal is gemaakt. Omdat ik het proces van het maken van het scherm en het uitvoeren van de opdrachten daarin probeer te automatiseren, wil ik voorkomen dat ik me moet vasthechten en loskoppelen binnen een script. Ik zal proberen een shell-script te maken met de opdrachten die ik moet uitvoeren in het scherm en te bewerken op basis van mijn resultaten.

Is er een manier om een ​​scherm te maken en een opdracht in het scherm uit te voeren, in één opdracht of zonder dat u zich na het maken maar vóór de uitvoering van de opdracht aan het scherm moet hechten?

Bij voorbaat dank.

** Update - nadat ik de suggestie heb geprobeerd om de opdrachten die ik moet uitvoeren binnen een shellscript te plaatsen, heb ik met succes een scherm kunnen maken en de opdrachten vanuit het scherm kunnen uitvoeren, maar ik krijg het gedrag dat wanneer het script niet meer draait het scherm sluit ook. Dit zou geen probleem moeten zijn, omdat het script een logboekregistratiescript is dat alleen moet stoppen met de kennis van de sys-admin of met het script dat ik probeer te ontwikkelen, maar het zou de voorkeur hebben om de schermconfiguratie op zo'n manier te hebben dat het scherm verdwijnt niet als het script wordt gestopt. Is het mogelijk om dit gedrag te bereiken? **


25
2018-01-20 16:32


oorsprong


Ik kwam hetzelfde probleem tegen en vond een oplossing op superuser.com voor iedereen die dit probleem tegenkomt superuser.com/questions/342463/... - Dan Herbert
Om het scherm open te houden zou je iets kunnen gebruiken als: screen bash -c 'echo' test "; / Bin / bash' - gwyn
Voor uw probleem met automatisch sluiten, kunt u een special gebruiken .screenrc die de regel bevat zombie kr, waardoor een voltooid venster open blijft en u kunt op drukken k om de winodw te sluiten, of r om de opdracht opnieuw in het venster uit te voeren. Ik heb dit voor mijn standaard .screenrc. - Martin C.


antwoorden:


Ik denk dat je verschillende problemen tegenkomt.

Als de opdracht is voltooid voordat u opnieuw bevestigt, verdwijnt het scherm. U kunt dit demonstreren met behulp van:

screen -d -m ls -l

Het zal de ls -l commando, maar screen -list zal het niet laten zien als het schermproces is beëindigd.

Ik heb ook geen idee wat je probeert te doen met deze \ 015 dingen. Misschien helpt het bijwerken van je vraag, want wat ik denk dat je probeert te doen, is meerdere opdrachten uitvoeren in een schermsessie. Dit zou zo simpel moeten zijn als:

screen -d -m bash -c "command1 ; command2 ; command3"

Als deze veel worden gebruikt, moet je misschien een shell-script maken dat alleen deze opdrachten uitvoert, en dan een eenvoudiger gebruiken:

screen -d -m /path/to/script.sh

17
2018-01-20 16:43



is er een manier om hetzelfde gedrag te krijgen zonder dat het scherm onmiddellijk wordt losgemaakt? Stel dat ik een ssh-sessie wil starten en dan direct daarna loskoppelen; screen -d -m ssh wordt verwijderd bij de wachtwoordprompt voordat de sessie wordt gestart. - bright-star
Dit werkt niet voor mij. Vervanging van het "commandN" door een aantal langlopende programma's resulteert in niets dat verschijnt screen -list. Dit geeft ook geen naam aan het scherm zoals het OP probeert te doen. - Cerin
Ik was op zoek naar een Python-programma met deze methode. Ik heb geprobeerd een sh-script te maken om het uit te voeren, maar ik heb het scherm in de lijst niet gezien. In plaats daarvan gebruikte ik screen -d -m python EventGenerator.py, wat prima werkte - Dan Ciborowski - MSFT
Dat zou waarschijnlijk zo moeten zijn bash -c "commands" in plaats van bash "commands" - marcovtwout
Je hebt gelijk, er moet -c zijn. - Xdg


Start een vrijstaand scherm

screen -dmS <screen name>

Voer de opdracht uit in een eerder gemaakt losstaand scherm

screen -S <screen name> -X stuff '<CMD>\n'

Ja, je moet het enter-symbool typen om de opdracht in te dienen, anders voegt hij de string gewoon aan het scherm toe.

http://osdir.com/ml/gnu.screen/2003-09/msg00029.html


4
2018-03-04 11:56





Ik ben dit probleem eerder tegengekomen, het was een bug met de cygwin-implementatie.

Wat ik deed was een ".screenrc_detaching" maken met alleen het volgende commando

#detach
detach 

en start het scherm met

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

Dan heb je je schermsessie en die is al gekoppeld en losgemaakt en je bent goed om commando's naar toe te pompen.

Makkelijk! : P


2
2017-11-04 14:49





Dit deed het werk voor mij, zonder -c werkte niet

screen -d -m bash -c "command1; command2; command3"


2
2017-09-12 10:04





Een manier om de vorige antwoorden te testen is:

 # No sessions:
screen -ls

 # Returns immediately:
time screen -dmS screen_descritive_session_name  bash -c 'sleep 20; hostname >> /tmp/h'

 # New session present:
screen -ls

 # File with return of command was created :)
sleep 20; cat /tmp/h

Het verwachtingsresultaat moet vergelijkbaar zijn met:

No Sockets found in /var/run/screen/S-yourusernamehere.

(Dat betekent dat er voorheen geen screen-sessie was gemaakt)

real    0m0.002s
user    0m0.000s
sys     0m0.000s

(Het is de tijd die het kost om een ​​scherm te maken en er los van te komen.) Bijna ogenblikkelijk.)

There is a screen on:
    20318.screen_descritive_session_name    (20/08/2018 16:29:35)   (Detached)
1 Socket in /var/run/screen/S-yourusernamehere.

(Deze uitvoer toont schermsessies beschikbaar. Gemaakt op laatste commando.)

sleep 20; cat /tmp/h

(Deze cat toont de hostnaam uitgevoerd binnen gnu-scherm)


1
2017-08-17 17:24



en wat is het resultaat van dergelijke tests? - Pierre.Vriens
Je hebt gelijk, er was geen voorbeeld. Ik zal toevoegen. - Enrique S. Filiage
veel beter! merci! 1 - Pierre.Vriens