![通过 ssh 重新启动分离屏幕中的进程](https://linux22.com/image/1355462/%E9%80%9A%E8%BF%87%20ssh%20%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%E5%88%86%E7%A6%BB%E5%B1%8F%E5%B9%95%E4%B8%AD%E7%9A%84%E8%BF%9B%E7%A8%8B.png)
我有一台服务器上运行着多个屏幕,每个屏幕都有自己的节点服务器列表到不同的端口。我想创建 Jenkins 作业来 ssh 进入框,重新连接特定屏幕,停止进程,从 git 中提取,重新启动应用程序,然后分离屏幕。你能把 Ctrl+C 塞进屏幕吗?考虑一下:
ssh myuser@myserver "screen -S 1234.myscreen -X stuff '[[Ctrl+C]] && git pull origin master && npm install && node app' [[Detach screen]]"
答案1
Ctrl+C 发送 SIGINT。因此,如果您可以确定要发送信号的进程的 PID,则可以kill -INT pid
在 之前执行此操作git pull
,或者killall -INT processname
如果您想停止所有进程(假设您的killall
行为不像 )killall5
。
至于编写分离屏幕会话的脚本,我不知道。也许其他人可以帮你。
编辑:我刚刚想到你不需要编写分离脚本或对屏幕执行任何操作。只需在屏幕内执行如下操作:
while sleep 1; do
./some_program # which saves its PID to a pidfile
git pull
done
然后你就可以通过 ssh 从外部屏幕执行此操作:
kill -INT $(cat pidfile)
如果您的进程没有保存 pidfile,您可以尝试使用 start-stop-daemon 来执行此操作:
start-stop-daemon --start --exec ./some_program --pidfile pidfile --make-pidfile
答案2
Ctrl+C 序列必须作为文字 ^C 字符输入:(
Ctrl+V允许插入文字字符),然后Ctrl+C
当使用该stuff
命令时,screen 不会以交互方式附加会话,因此无需分离。但是,您可能需要在最后一个命令后输入回车符,输入内容如下:
Ctrl+V Ctrl+M