別のttyでプロセスを開始する


31

グーグルで約1時間後、これまで誰も実際にこの質問をしていない信じられません...

そのため、TTY1で実行するスクリプトがあります。そのスクリプトがTTY2で任意のプログラムを起動するようにするにはどうすればよいですか?

  • を見つけましたtty。これは、現在どのTTYにいるかを示しています。
  • 私はwritevt、別のTTYに1行のテキストを書き込むを見つけました。
  • が見つかりましたchvt。これにより、現在表示されているTTYが変わります。

TTY2 を表示したくありません。メインスクリプトを正常に実行し続けるだけですが、手動でTTY2に切り替えると、2番目のプログラムと対話できます。


TTY1から、試してみましたか[command] > /dev/tty2(tty2にすでにログインしている必要があります)?
パンディア14年

1
これはXYの問題かもしれません...何を達成しようとしていますか?全体的な目標は何ですか?
オリビエデュラック14年

回答:


32
setsid sh -c 'exec command <> /dev/tty2 >&0 2>&1'

他のTTY(/dev/tty2この例では)を使用していない限り、これは機能するはずです。これには、getty誰かがログインするのを待っているプロセスが含まれます。TTYから入力を読み取る複数のプロセスがあると、予期しない結果が生じます。

setsid 新しいセッションでコマンドを開始します。

設定を正しくcommand設定する必要があることに注意してくださいstty。たとえば、「調理済みモード」をオンにしてonlcr、改行を出力すると復帰が追加されるなどです。


2
それは正しくありません。あなたが制御端末を混ぜる/dev/stdin/dev/stdout/dev/stderr。あなたの場合、制御端末がまったくないことをps簡単に示しcommandます。
ホークレイジング14年

1
@HaukeLaging、セッションリーダーは、ターミナルを開くとすぐにターミナルを制御します。問題は、セッションリーダーが端末デバイスを開いていなかったことです。今すぐ修正する必要があります。
ステファンシャゼル14年

@StéphaneChazelasでテストしましたがsleep 1000、まだ動作しません。ただし、疑似ttyを使用しました(違いはないはずです)。
ホークレイジング14年

@HaukeLagingどのように正確にやったのですか?その端末には既に制御セッションがありませんでした(他のTTY部分を使用しているものがない限り)。
ステファンシャゼル14年

1
@StéphaneChazelas setsid sh -c 'exec sleep 1000 <>/dev/pts/4 >&0 2>&1'ターミナルエミュレータウィンドウで実行しました。/dev/pts/4別のターミナルエミュレータウィンドウ(同じユーザー、bash実行中)です。
ホークレイジング14年

6

2番目のttyでは、通常、ログインプログラムまたはbashのようなシェルのいずれかのプログラムが実行されます。対話が必要な場合は、ログインプログラムを自分のものに置き換えるか、プログラムがコマンドラインから起動されたかのようにプログラムを実行するようシェルに指示する必要があります。

より単純なソリューションであるIMOはtmux、2番目の画面にログインしてからセッションを開始し、次を使用することです。

tmux send yourcommand ENTER

tmux2番目の端末に切り替えた後に表示されるセッションでプログラムを開始します。


2

私はちょうど発見をしました:

起動時に2つのttyからアプリケーションを起動するにはどうすればよいですか?

コメントの1つに呼ばれるものがありopenvtます。このコマンドは、私が望んでいるとおりのことをするようです!

http://linux.about.com/library/cmd/blcmdl1_openvt.htm

誰かが違うことを知らない限り、これはおそらくこれを行うための「正しい」方法だと思います。

(試してみたところ、うまくgetty動作しているようです。実行中であっても、次の未使用の端末を選択します。


0

followコマンドでvt5で新しいグラフィカルセッションを開始します

xinit "/usr/bin/<binary_executable>" -- :1 vt5

例えば ​​:

xinit "/usr/bin/playonlinux" -- :1 vt5

すでにアクティブなグラフィカルセッションでグラフィカルアプリケーションを起動する場合は、次のようにします。

DISPLAY=:0 "/usr/bin/playonlinux"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.