J'ai un processus serveur de longue durée dans une session d'écran sur mon serveur Linux. C'est un peu instable (et malheureusement, pas avec mon logiciel, je ne peux donc pas résoudre ce problème!), Je souhaite donc créer un script pour relancer le processus tous les soirs afin d'améliorer la stabilité. La seule façon de lui faire faire un arrêt en douceur consiste à accéder au processus d'écran, à passer à la fenêtre dans laquelle il s'exécute et à entrer la chaîne "stop" sur sa console de contrôle.
Existe-t-il des contorsions intelligentes de la redirection que je puisse faire pour qu'un cronjob envoie cette commande stop à une heure précise chaque jour?
ls -l /proc/7417/fd/0
./dev/pts/19
), ley
caractère n'atteignant pas l'application elle-même. C'est semblable à ce qui se passe lorsque vous utilisez la commande write (1) . Quoi qu'il en soit, essayez soit mon autre réponse, soit un outil d'automatisation graphique tel que xdotool .Solution basée sur l'écran
Démarrez le serveur comme ceci:
l'écran va démarrer en mode détaché, donc si vous voulez voir ce qui se passe, lancez:
Contrôlez le serveur comme ceci:
(cette réponse est basée sur l' envoi de la saisie de texte à un écran détaché du Unix et Linux site frères et soeurs)
Explication des paramètres:
solution basée sur tmux
Démarrez le serveur comme ceci:
tmux démarrera en mode détaché, donc si vous voulez voir ce qui se passe, lancez:
Contrôlez le serveur comme ceci:
Explication des paramètres:
la source
Essayez ceci pour commencer:
Et ceci pour tuer:
la source
echo "xxx" > cmd
(car le canal sera fermé). Bien que certains programmes soient assez intelligents pour rouvrir (rewind(3)
) leur stdin quand ils rencontrent EOF.Il est possible d'envoyer du texte d'entrée à un processus en cours d'exécution sans exécuter l'
screen
utilitaire ni aucun autre utilitaire sophistiqué. Et cela peut être fait en envoyant ce texte d'entrée au "fichier" d'entrée standard du processus/proc/PID#/fd/0
.Cependant, le texte saisi doit être envoyé d'une manière spéciale pour être lu par le processus. L'envoi du texte saisi via la
write
méthode de fichier standard ne fera pas en sorte que le processus reçoive le texte. En effet, cela ne fera qu'ajouter à ce "fichier", mais ne déclenchera pas le processus pour lire les octets.Pour que le processus lise les octets, il est nécessaire d'effectuer une
IOCTL
opération de typeTIOCSTI
pour chaque octet à envoyer. Cela placera l'octet dans la file d'attente d'entrée standard du processus.Ceci est discuté ici avec quelques exemples en C, Perl et Python:
https://unix.stackexchange.com/questions/48103/construct-a-command-by-putting-a-string-into-a-tty/48221
-
Donc, pour répondre à la question initiale posée il y a presque 9 ans, le travail cron devrait exécuter un script / programme utilitaire similaire aux exemples donnés par les utilisateurs pour cette autre question, qui enverrait la chaîne "stop \ n" à ce processus serveur. dans la question, en envoyant chacun des 5 octets via une
IOCTL
opération de typeTIOCSTI
.Bien entendu, cela ne fonctionnera que sur les systèmes prenant en charge le
TIOCSTI
IOCTL
type d'opération (comme Linux), et uniquement à partir duroot
compte d'utilisateur, car ces "fichiers"/proc/
sont "détenus" parroot
.la source
Au cas où cela aiderait quelqu'un:
j'ai eu un problème similaire, et comme le processus que j'utilisais ne faisait pas
screen
ou pastmux
, je devais adopter une approche différente.J'attaché
MODIFIERgdb
àxterm
ce que mon processus était en cours d' exécution dans et utilisécall write(5, "stop\n", 5)
degdb
pour écrire dans le descripteur de fichier pty maître.J'ai découvert le descripteur de fichier auquel envoyer les données en cherchant
/proc/<pid>/fd
un lien/dev/ptmx
, puis des essais et des erreurs entre les deux options (l'envoi de ma chaîne aux deux descripteurs de fichier correspondants ne semblait causer aucun préjudice).Il s’est avéré que le
FIN ÉDITERxterm
processus auquel j’avais attaché était engendré par l’spawn-new-terminal()
xterm
action d’un raccourci clavier, et le deuxièmeptmx
descripteur de fichier ouvert était simplement le processusptmx
parentxterm
qui n’avait pas été fermé.Par conséquent, les appels d'essai et d'erreur avaient envoyé une sortie à cet autre terminal.
La plupart des
xterm
processus n'ont pas deuxptmx
descripteurs de fichier.Cela a efficacement tapé cette chaîne dans le terminal et l'a donc envoyée au processus qui l'exécutait.
nb vous devrez peut-être autoriser l'attachement à un processus en cours avec quelque chose comme
sudo bash -c "echo 0 > /proc/sys/kernel/yama/ptrace_scope"
la source
Puisque je ne peux pas commenter la réponse la plus acceptée de Cristian Ciupitu (de 2010), je dois mettre cela dans une réponse séparée:
Cette question a déjà été résolue dans ce fil de discussion: https://stackoverflow.com/questions/5374255/how-to-write-data-to-existing-processs-stdin-from-external-process
En bref:
Vous devez démarrer votre processus avec un tuyau pour stdin qui ne bloque pas ni ne ferme pas lorsque l'entrée actuelle a été écrite. Ceci peut être implémenté par une simple boucle sans fin qui sera acheminée vers le processus en question:
Je peux confirmer que c'est différent de la manière dont Krissi a ouvert un tuyau qui ne fonctionnait pas dans mon cas. La solution montrée a bien fonctionné à la place.
Vous pouvez ensuite écrire dans le fichier ... / fd / 0 du processus pour lui envoyer des instructions. Le seul inconvénient est que vous devez également mettre fin au processus bash, qui exécute la boucle sans fin après la fermeture du serveur.
la source