web-dev-qa-db-ja.com

cronを使用して、画面を使用せずに端末でプロセスを開始しますか?

Cronを使用してターミナルでプロセスを開始したい。ターミナルでプロセスを開始して、ターミナルでプロセスの出力を継続的に確認し、強制終了/再起動などできるようにします。「screen -p -X」を使用して、screenを介してこれを実行できることを知っています。 stuff "ですが、最近、画面のフリーズに関する奇妙な問題が発生しました( 画面セッションがフリーズし、出力は停止しますが、プロセスは実行を継続します。画面を再利用できますか? )、次の方法があるかどうか疑問に思いました。画面を使用せずにターミナルでcronを介してプロセスを開始しますか?事前に端末を作成し、手作業で名前を変更するなどしておくことができます。

1
user10

これは、新しい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を入手するにはどうすればよいですか? を参照してください。

1
mikeserv