SSHを介してメンテナンスしているシステムで問題が発生しています。 TTYを必要とするコマンドをテストすると、おそらくSSHセッションが原因で機能します。不明確な状況では、TTYが利用できず、Sudo
のようなコマンドが原因で失敗する
(Sudo: sorry, you must have a tty to run Sudo)
SSHシェルで成功するため、問題が発生する前に追跡するのが困難になります。これは繰り返し発生する問題なので、TTYを提供しないシェルでスクリプトへの変更をテストする方法を探しています。
Ubuntu 19.04、CentOS 6、Debian 9でbashとkshを使用しています。
Ttyはシェルでは提供されません(関係は逆です)。 ttyは端末エミュレーターによって提供されます。プログラムは2つの部分でターミナルから自分自身を「切り離す」ことができます(テストされたプログラムが実際にチェックするものに依存します)
Stdin/stdout/stderr(通常は端末を指す)を閉じます。たとえば、/ dev/nullから入力をリダイレクトし、出力をファイルに送信するか、パイプを介して送信できます。
true | myapp 2>&1 | cat
myapp </dev/null |& cat
Setsid()を呼び出して、controlling terminalから切り離します(そうしないと、/ dev/ttyからアクセスでき、プログラムがシェルのジョブ制御の対象になります)。シェルから同じ名前のツールを使用できます:
setsid myapp
この2つを組み合わせると、次のようにテストスクリプトを実行できると思います。
true | (setsid ./testscript.sh) 2>&1 | cat
(setsid ./testscript.sh) </dev/null |& cat
(はい、かっこは意図的なものです– setsid
ツールがforkする必要がなくなり、予期せず「バックグラウンド」になります。)