Linux

寫入後台程序的標準輸入

  • December 23, 2021

我在一個 Ubuntu 10.04 機器上,並通過 ssh 在後台(myserver &)啟動了一個伺服器。它一直執行良好,但我需要一種方法來獲取伺服器的標準輸入,因為控制伺服器的唯一方法是通過這種方法。

有什麼方法可以獲取已經執行的程序的標準輸入,以便我可以寫入它(並希望讀取它的標準輸出)?顯然,如果我現在要這樣做,我會從 FIFO 重定向到標準輸入開始,但不幸的是現在有點晚了。

有任何想法嗎?

您可以嘗試寫入它的 /proc pid 目錄。假設你的守護程序的 pid 是 2000,嘗試寫入 /proc/2000/fd/0

您可以使用命名管道 (fifo) 作為輸入來啟動伺服器:

mkfifo /tmp/srv-input
cat > /tmp/srv-input &
echo $! > /tmp/srv-input-cat-pid
cat /tmp/srv-input | myserver &

cat > /tmp/srv-input &避免您的伺服器收到 EOF 很重要。至少一個程序必須以書面形式打開 fifo,這樣您的伺服器就不會收到 EOF。該命令的 PID 保存在/tmp/srv-input-cat-pid文件中以供稍後殺死。

在您已經啟動伺服器的情況下,您必須使用調試器,例如gdb附加到您的程序以將其重定向stdin到 fifo:

gdb -p PID
call close(0)
call open(0, "/tmp/srv-input", 0600)

然後執行類似下面的操作將輸入發送到您的伺服器(如有必要,在另一個終端視窗中):

echo "command" > /tmp/srv-input

要將 EOF 發送到您的伺服器,您需要終止cat > /tmp/srv-inputPID 已保存在/tmp/srv-input-cat-pid file.

在 GDB 的情況下,只需退出 GDB,就會發送 EOF。

引用自:https://serverfault.com/questions/188936