次のコード ブロック ( at
PHPmyadmin をアンインストールするためのタイムアウト) を実行しました。2 時間先に実行するようにスケジュールする必要がありますが、テストのために 2 分のタイムアウトで実行しました。
bash /dev/fd/50 50<< PMA_UNINSTALL | at 'now + 2 minutes'
apt-get purge phpmyadmin -y
PMA_UNINSTALL
このユーティリティは、 +at
を実行しない限り、Bash を自由に使用できないようにしているようです。また、次の警告も表示されますが、これは正常であり、ユーティリティのソース コードにハードコードされています。+を実行すると警告が消え、Bash を再び通常どおり使用できるようになります。CTRLCAt
CTRLC
コマンドは/bin/shを使用して実行されます
警告が表示される限り、それが Bash を定期的に使用できない原因であるとは言いません。警告は単なる stdout であり、他の何かが stdin の作成を妨げている可能性があることはわかっています。
上記のコード ブロックを stdin パイプで作成できないのはなぜですかat
。また、 でパイプされたコマンドを実行できる状態に到達し、at
作業を中断せずにその直後に Bash を自由に使用するにはどうすればよいですか。
答え1
at
あなたの本当の問題がわかるまで、少し時間がかかりました。私が想定したように、後でコマンドを提供するのではなく、コマンドを直接 に送信したいのです。
複雑なスキームは必要ありません。
echo 'apt-get purge phpmyadmin -y' | at 'now + 2 minutes'
この方法を実行すると、at
その後の入力は期待されず、すぐにコマンド ラインに戻ります。
(私の元の回答はここに残しておきます)
発行するとat
、実行するコマンドをリストできるようになります。at
完了したことを通知する必要があります。
CTRL+ (これDは送信終了)
答え2
TL;DR: これらのコマンドは、おそらく意図したとおりには動作しないようです。
2 分以内にat
実行しようとしている場合、コードは期待どおりに動作しません。apt-get purge phpmyadmin -y
bash
パイプの左側のコマンド ( |
) は、ヒア ドキュメントを標準入力として受け取ります。そのコマンドは、シェルがヒア ドキュメント全体を読み取るまで実行されません。
から3.6.6 ヒアドキュメントの中にBash リファレンスマニュアル:
このタイプのリダイレクトは、シェルに現在のソースから入力を読み取り、言葉(末尾の空白なし)が見つかると、その時点までに読み込まれたすべての行が標準入力(またはファイル記述子)として使用されます。んもしんコマンドに が指定されている場合に使用します。
ヒアドキュメント付きのコマンドは、実際には、実行前にシェルによって完全に読み取られる単一のコマンドです。コードでは、シェルは入力を読み取ります。それまで PMA_UNINSTALL
が単独で行に現れる。そうなると、シェルはそれからヒアドキュメントの内容をコマンドのファイル記述子50として使用しますbash /dev/fd/50
。
bash
このコマンドは、ヒアドキュメントが完全に読み込まれるまで、の新しいインスタンスを開始しません。bash
が実行されると、次のコマンドが実行されます。
apt-get purge phpmyadmin -y
パイプの左側全体がヒアドキュメントを含む標準出力は にパイプされておりat
、入力at
は出力のbash
出力であるの解釈を試みますapt-get purge phpmyadmin -y
。コマンドではなく、at
apt-get
出力-- で実行するコマンドのリストとして/bin/sh
。
したがって、これはほぼ間違いなくあなたがやろうとしていることではないでしょう。
なぜそのコードを入力した直後にシェルプロンプトが返されないのかわかりません。テストマシンで実行すると、数秒でシェルプロンプトが返されます。これをデバッグしたい場合は、apt-get purge phpmyadmin -y
bashで対話的に実行してみてください。コードの記述方法では、そのコマンドは完全に実行されます。前に at
シェルに戻ります (そして、at
何かをスケジュールする前に)。ただし、この特定のコードをさらにデバッグすることはおそらく役に立ちません。