У меня есть пакетный скрипт, который запускает приложение сервера Java внутри экрана. Команда выглядит так:
cd /dir/ && screen -A -m -d -S javascreen java -Xms640M -Xmx1024M -jar javaserverapp.jar nogui
После запуска пакетного сценария он запускает сервер и помещает его на нужный экран. Если я перечисляю свои экраны после, я вижу что-то вроде этого:
user@gtwy /dir $ screen -list
There is a screen on:
16180.javascreen (Detached)
1 Socket in /var/run/screen/S-user.
Однако у меня есть второй пакетный сценарий, который отправляет автоматические команды на этот сервер и работает с другим интервалом crontab. Из-за особенностей работы приложения я отправляю ему следующие команды (эта команда сообщает ему, что подключенным пользователям нужно «тестировать 123»):
screen -X exec .\!\! echo say testing 123
Я также пробовал:
screen -R -X exec .\!\! echo say testing 123
screen -S javascreen -X exec .\!\! echo say testing 123
К сожалению, эти команды НЕ РАБОТАЮТ. Они даже не выдают мне сообщения об ошибке, они просто ничего не делают.
ОДНАКО - если я сначала вручную подключусь к экрану (с помощью приведенной ниже команды), а затем отключаюсь, теперь я могу безупречно запустить любую из вышеперечисленных команд. Я могу продемонстрировать это на видео, если мне здесь недостаточно ясно.
screen -r -d
Заранее спасибо.
Обновление: вот важные части / etc / screenrc. Он должен быть полностью ванильным, я никогда не редактировал этот файл.
# VARIABLES
# ===============================================================
# No annoying audible bell, using "visual bell"
# vbell on # default: off
# vbell_msg " -- Bell,Bell!! -- " # default: "Wuff,Wuff!!"
# Automatically detach on hangup.
autodetach on # default: on
# Don't display the copyright page
startup_message off # default: on
# Uses nethack-style messages
# nethack on # default: off
# Affects the copying of text regions
crlf off # default: off
# Enable/disable multiuser mode. Standard screen operation is singleuser.
# In multiuser mode the commands acladd, aclchg, aclgrp and acldel can be used
# to enable (and disable) other user accessing this screen session.
# Requires suid-root.
multiuser off
# Change default scrollback value for new windows
defscrollback 1000 # default: 100
# Define the time that all windows monitored for silence should
# wait before displaying a message. Default 30 seconds.
silencewait 15 # default: 30
# bufferfile: The file to use for commands
# "readbuf" ('<') and "writebuf" ('>'):
bufferfile $HOME/.screen_exchange
#
# hardcopydir: The directory which contains all hardcopies.
# hardcopydir ~/.hardcopy
# hardcopydir ~/.screen
#
# shell: Default process started in screen's windows.
# Makes it possible to use a different shell inside screen
# than is set as the default login shell.
# If begins with a '-' character, the shell will be started as a login shell.
# shell zsh
# shell bash
# shell ksh
shell -$SHELL
# shellaka '> |tcsh'
# shelltitle '$ |bash'
# emulate .logout message
pow_detach_msg "Screen session of \$LOGNAME \$:cr:\$:nl:ended."
# caption always " %w --- %c:%s"
# caption always "%3n %t%? @%u%?%? [%h]%?%=%c"
# advertise hardstatus support to $TERMCAP
# termcapinfo * '' 'hs:ts=\E_:fs=\E\\:ds=\E_\E\\'
# set every new windows hardstatus line to somenthing descriptive
# defhstatus "screen: ^En (^Et)"
# don't kill window after the process died
# zombie "^["
Садрул на #screen (Freenode) дал такой ответ, и он сработал:
с помощью команд -X попробуйте также указать номер окна (например, screen -p0 -X ...)