标签: stdin

我可以向在 screen 会话中运行的活动进程的 STDIN 发送一些文本吗?

我的 Linux 服务器上的屏幕会话中有一个长时间运行的服务器进程。它有点不稳定(遗憾的是不是我的软件,所以我无法修复它!),所以我想编写一个每晚重新启动该过程的脚本以帮助稳定性。让它正常关闭的唯一方法是转到 screen 进程,切换到它正在运行的窗口,并在其控制台上输入字符串“stop”。

我可以做任何智能重定向扭曲来让 cronjob 每天在固定时间发送该停止命令吗?

linux gnu-screen stdin

86
推荐指数
5
解决办法
12万
查看次数

写入后台进程的标准输入

我在 Ubuntu 10.04 机器上,并通过 ssh 在后台 (myserver &) 启动了一个服务器。它一直运行良好,但我需要一种方法来获取服务器的标准输入,因为控制服务器的唯一方法是通过这种方法。

有什么方法可以获取已经运行的进程的标准输入,以便我可以写入它(并希望读取它的标准输出)?显然,如果我现在要这样做,我会从重定向到标准输入的 FIFO 开始,但不幸的是,现在这样做有点晚了。

有任何想法吗?

linux bash background-process stdin

31
推荐指数
3
解决办法
4万
查看次数

有没有办法让 objdump 从 STDIN 而不是文件读取?

在我的特定情况下,我想用它来转储我的echo.
我不想涉及任何文件......
有没有办法让objdump读取STDIN

linux bash stdin

10
推荐指数
2
解决办法
3499
查看次数

以与直接写入相同的效果/行为写入正在运行的进程的标准输入

这篇文章只回答了我的部分问题。我的问题是,使用 /proc 文件系统上的进程的 FD 写入正在运行的进程的 stdin 不会产生相同的效果。

问题:

  1. 启动 nc 侦听端口 10000(此过程进一步称为 nc 1)

    nc -l 10000
    
    Run Code Online (Sandbox Code Playgroud)
  2. 启动另一个 nc 向监听 nc 发送字符(这将是 nc 2)

    nc localhost 10000
    
    Run Code Online (Sandbox Code Playgroud)
  3. 写入 nc 2 上的标准输入

    echo "some chars here" >> /proc/[PID-nc-2]/fd/0
    
    Run Code Online (Sandbox Code Playgroud)

问题:“这里有一些字符”没有进入监听 nc (nc 1),但显示在 nc 2 的控制台上。

问题:为什么以及是否有可能使它起作用?

linux stdin

8
推荐指数
2
解决办法
4492
查看次数

使用管道写入正在运行的进程的标准输入

我处于与这篇文章类似的情况 但我无法得到那里提供的解决方案来解决我的情况,因为答案似乎只与该问题有关。

特别是,我无法理解这样做的目的是什么

cat my.fifo | nc remotehost.tld 10000
Run Code Online (Sandbox Code Playgroud)

就我而言,我有一个进程正在运行并等待输入。如何使用命名管道向该进程发送输入?

我试过echo 'h' > /proc/PID/fd/0它只是在进程窗口上显示“h”。

linux process stdin

8
推荐指数
1
解决办法
1万
查看次数

测试正在等待标准输入的脚本

有没有办法确定脚本是否正在等待 stdin 并在检测到命令时退出?

这是一个例子,我正在执行的命令需要很长时间才能运行,但它也会在启动 w/oa 提示之前提示输入。我想知道该命令实际上是在做某事,而不仅仅是在等待。

提供了以下名为 ./demo 的脚本

#!/bin/bash

read
Run Code Online (Sandbox Code Playgroud)

有没有办法检测读取正在等待标准输入?就像是

failifwaitingonstdin | ./demo
Run Code Online (Sandbox Code Playgroud)

一旦检测到读取命令,它将立即返回。

更新:

人们已经建议了诸如expect 和yes 之类的程序。在深入研究 yes 之后,我看到他们如何能够支持这种交互方式。他们不断地使用 fputs 将“y”写入标准输出。我可以简单地在 fputs 在写入标准输出时返回时立即返回错误,而不是无限地执行此操作。

scripting bash stdin

7
推荐指数
1
解决办法
1万
查看次数

守护程序调用的前台程序是否应该根据严重性级别在 stderr 和 stdout 之间拆分日志记录?

通常日志消息写入 stderr。我想知道拆分日志消息是否是一个好主意/实践,以便错误和警告转到标准错误,而调试/信息/通知消息转到标准输出?或者这是否无关紧要,因为许多专用日志记录进程无论如何只能从 stdin 读取,这需要将 stderr 和 stdout 中的源日志消息组合起来并重定向到记录器的 stdin。

[更新]

下面的两个答案都提到了系统日志,我想我需要详细说明设置。

我询问的守护进程自己在前台运行。守护进程由监督进程管理,例如runitsupervisord。在这两种情况下,守护进程的 stderr 和 stdout 将被监督进程捕获,并且监督进程的工作是决定如何以及在哪里存储日志(可能是系统日志,或者通过 UDP 网络中的其他地方) . 守护进程不必担心写入日志的内容和位置,因为它们只是写入 stdout/stderr。

在 的情况下runit,其日志记录工具svlogd将从其 stdin 中读取重定向的日志消息,这些消息是托管守护进程的 stderr/stdout 组合。至于supervisord,它可以记录 stderr 和 stdout 以分隔日志文件。

因此,在这种特定设置中,在 stderr 和 stdout 之间拆分日志还是仅写入其中一个是一种好习惯?

logging daemon stderr stdin stdout

7
推荐指数
2
解决办法
910
查看次数

如何将文本发送到 docker 容器的标准输入?

我有一个 docker 容器,它在启动时在前台运行一个 java 程序。java 程序侦听 上的输入stdin。如何以编程方式将文本发送到 java 程序?

容器以 开头-it,因此我可以docker attach <container-name>输入文本,使用 Enter 发送并使用 分离^p ^q

我试过docker exec <container-name> echo my-text,但这会回显到标准输出,而不是 java 程序。我可以以某种方式将它传递给 java 程序吗?

我也在Docker 论坛中发现了一个类似的问题,但该解决方案使用screen,我宁愿有一个更干净的解决方案。

pipe stdin docker

6
推荐指数
2
解决办法
5975
查看次数

防止 sudo、apt-get 等将粘贴的输入吞入 STDIN?

我经常编写 wiki 说明以在 Ubuntu(目前为 11.10 Oneiric)上安装各种服务器包。它们总是涉及以下内容:

sudo apt-get install -y postfix
sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix
Run Code Online (Sandbox Code Playgroud)

但是当您将其剪切并粘贴到终端时,sudo、apt-get 或某些子shell 会随机吞下后续的输入行,并且只会apt-get install发生这种情况。

有没有办法让它更易于剪切和粘贴?我想我可以用

cat > script <<EOF
apt-get install -y postfix
cp ~/siteconfig/etc/postfix/main.cf /etc/postfix
EOF
sudo sh ./script
Run Code Online (Sandbox Code Playgroud)

但有更好的方法吗?

scripting bash sudo stdin

5
推荐指数
2
解决办法
1456
查看次数

如何防止脚本吞下所有标准输入?

我有一个脚本,它从循环中的管道读取并在循环中运行一个期望脚本和一个普通的 shell 脚本。这两个脚本都运行 ssh 到另一台服务器以获取一段数据。例如:

cat /tmp/file |
while read a b c d
do
   s=`expect-script server1 $b`
   c=`ssh $b normal-script`
   echo $s $c
done
Run Code Online (Sandbox Code Playgroud)

即使 /tmp/file 中有很多行,脚本也会在处理第一行后退出。我怀疑预期脚本正在吞噬所有标准输入,因此当它返回时,没有任何东西可以阅读。我怎样才能避免这种情况?我不希望我调用的任何脚本从主脚本的 stdin 中读取。

ssh shell stdin expect

5
推荐指数
1
解决办法
2754
查看次数