cronを使用して端末でプロセスを開始したいと思います。端末からプロセスの出力を継続的に確認し、終了/再開などを行うことができるように、プロセスが端末から開始されることを望みます。 「screen -p -X stuff」を使って画面上でこれを行うことができることを知っていますが、最近画面がフリーズするという奇妙な問題が発生しました(画面セッションは停止し、出力は停止しますが、プロセスは引き続き実行されます。画面をリサイクルできますか?)画面を使用せずに端末でcronを介してプロセスを開始する方法があるかどうか疑問に思いますか?役に立つ場合は、端末を事前に作成して手動で名前を変更できます。
答え1
以下は、新しいpty記述子を取得して標準出力unlockpt()
に書き込むソリューションです。ptsname()
<<\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
ちょうど小さなCプログラムをコンパイルし、unlockpt()
stdin呼び出しを試み、成功すると新しく作成され、ロック解除されたptyの名前を印刷し、そうでなければstdout
自動的に2を返します。
Linuxシステムの場合 - 適切な許可(通常、グループに自分自身を追加すると、tty
最も簡単に達成できます。)- 新しいpty記述子を簡単に入手できます。
exec 3<>/dev/ptmx
./
...そして上記のプログラムをコンパイルしたとし、現在のシェルからメインサイドfdを取得します。
slave=$(./pts <&3)
...新しい記述子を実際に使用可能にし、そのデバイス名をシェル変数の値に入れます$slave
。
次に提供util_linux
パッケージがシステムにインストールされると、setsid()
そこに新しいプロセスをインストールできます。たとえば、次のようになります。
setsid -c sh 3>&- <>"$slave" >&0 2>&1
対話型プロセスを開始しsh
、ptyのセッションリーダーで終了し、デフォルトでは対話型シェルの背景として機能します。背景シェルは、>&3
ユーザー入力で書かれたすべてを解釈します。特に便利なものを書くことは次のとおりです。
echo "exec >$(tty) 2>&1" |
cat - /dev/tty >&3
一時的にバックグラウンドシェルとその子孫のすべての出力を現在の端末にリダイレクトし、同時にすべてのキーボード入力が存在する限り、バックグラウンドシェルにリダイレクトしますcat
。ただし、/dev/tty
スレーブではバックグラウンドシェルがptyなので、次のように現像を維持するのは簡単です。
echo 'exec >/dev/tty 2>&1' >&3
でも同じことができますが、cron
もちろんI / Oをスクリプトしたり、いくつかのパイプリレーを設定して自動的に実行したりすることもできます。
バラよりこのptyをどのように入手し、どうすればよいですか?もっと学ぶ。