3

У меня есть сервер с несколькими работающими экранами, каждый из которых имеет свой собственный сервер узлов, перечисляющий разные порты. Я хотел бы создать задания 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]]"

2 ответа2

2

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)

Если ваш процесс не сохраняет pid-файл, вы можете попробовать использовать start-stop-daemon, чтобы он сделал это:

start-stop-daemon --start --exec ./some_program --pidfile pidfile --make-pidfile
1

Последовательность Ctrl+C должна быть введена как буквальный символ ^ C:
Ctrl+V (позволяет вставить буквенный символ), затем Ctrl+C

Когда команда stuff используется, экран не присоединяет интерактивную сессию, поэтому нет необходимости отсоединять. Однако вам может потребоваться возврат каретки после последней команды, введенной в виде литерала:
Ctrl+V Ctrl+M

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .