Cronを使用してターミナルでプロセスを開始したい。ターミナルでプロセスを開始して、ターミナルでプロセスの出力を継続的に確認し、強制終了/再起動などできるようにします。「screen -p -X」を使用して、screenを介してこれを実行できることを知っています。 stuff "ですが、最近、画面のフリーズに関する奇妙な問題が発生しました( 画面セッションがフリーズし、出力は停止しますが、プロセスは実行を継続します。画面を再利用できますか? )、次の方法があるかどうか疑問に思いました。画面を使用せずにターミナルでcronを介してプロセスを開始しますか?事前に端末を作成し、手作業で名前を変更するなどしておくことができます。
これは、新しいpty記述子をunlockpt()
し、そのptsname()
をstdoutに書き込むソリューションです。
_<<\C cc -xc - -o pts
#include <stdio.h>
int main(int argc, char *argv[]) {
if(unlockpt(0)) return 2;
char *ptsname(int fd);
printf("%s\n",ptsname(0));
return argc - 1;
}
C
_
これは、stdinでunlockpt()
を呼び出そうとする小さなCプログラムをコンパイルし、成功すると、新しく作成されてロック解除されたptyの名前をstdout
に出力するか、サイレントに2を返します。
Linuxシステムの場合-適切な権限が与えられている場合(一般に、これらはtty
グループに自分を追加することで最も簡単に実現できます)-a新しいpty記述子は次のように簡単に取得できます...
_exec 3<>/dev/ptmx
_
...上記のプログラムを_./
_でコンパイルした場合、現在のシェルでマスター側のfdを取得するには...
_slave=$(./pts <&3)
_
...新しい記述子を実際に使用できるようにし、そのデバイス名をシェル変数_$slave
_の値に入れます。
次に、_util_linux
_パッケージがシステムにインストールされている場合は、次のように新しいsetsid()
プロセスをインストールできます。 :
_setsid -c sh 3>&- <>"$slave" >&0 2>&1
_
これにより、ptyのセッションリーダーとしてインタラクティブなsh
プロセスが起動し、終了します。基本的に、インタラクティブなシェルをバックグラウンド化します。バックグラウンド化されたシェルは、_>&3
_に書き込まれたものをユーザー入力として解釈します。書くのに特に便利なものは次のようになります。
_echo "exec >$(tty) 2>&1" |
cat - /dev/tty >&3
_
バックグラウンドシェルとその子からのすべての出力を一時的に現在の端末にリダイレクトすると同時に、cat
が存続する限り、すべてのキーボード入力をバックグラウンドシェルにリダイレクトします。ただし、バックグラウンドのシェルの_/dev/tty
_はスレーブのptyであるため、staus-quoは次のように簡単に復元できます。
_echo 'exec >/dev/tty 2>&1' >&3
_
同じようなことがcron
からも機能しますが、もちろん、代わりにI/Oのスクリプトを作成するか、パイプリレーを設定してジャグリングを自動的に実行する必要があります。
詳細については、 このptyを入手するにはどうすればよいですか? を参照してください。