LAUNCH EXTERNAL PROCESSからpidが取得できる
2 posters
LAUNCH EXTERNAL PROCESSからpidが取得できる
v16あたりからLAUNCH EXTERNAL PROCESSに新しい引数が追加されていました。
実行したプロセスIDが取得できる様です。
ですが非同期で実行した場合、正しいプロセスIDが取得できない様です。
ドキュメントを見ると、同期/非同期にかかわらずローンチしたプロセスIDが返ってくると書いてありました。
つづきに「この情報により、作成した外部プロセスとその後やりとり(例えば中止等)するのが容易になります。」と書いてあるのですが
これが必要なのは非同期の場合だと思いますが、別プロセスとして起動したプロセスIDが返ってこないと「後のやりとりは容易」ではないと思います。
同期の場合にはすでにそのプロセスは終了していますので不要です。
なんでこんな仕様なんでしょうか?
また非同期で起動したプロセスは、4Dを終了しても残っている様です。これも行儀が悪い様に思います。
実行したプロセスIDが取得できる様です。
ですが非同期で実行した場合、正しいプロセスIDが取得できない様です。
ドキュメントを見ると、同期/非同期にかかわらずローンチしたプロセスIDが返ってくると書いてありました。
つづきに「この情報により、作成した外部プロセスとその後やりとり(例えば中止等)するのが容易になります。」と書いてあるのですが
これが必要なのは非同期の場合だと思いますが、別プロセスとして起動したプロセスIDが返ってこないと「後のやりとりは容易」ではないと思います。
同期の場合にはすでにそのプロセスは終了していますので不要です。
なんでこんな仕様なんでしょうか?

また非同期で起動したプロセスは、4Dを終了しても残っている様です。これも行儀が悪い様に思います。
hosaka- 投稿数 : 241
登録日 : 2016/07/04
所在地 : 大阪
Re: LAUNCH EXTERNAL PROCESSからpidが取得できる
PIDを返す点についてですが,外部プロセスにタイムアウトを設定する標準的なAPIが(特にWindowsで)用意されていないことから,苦肉の索として追加された経緯があります。
4Dは,毎晩,ナイトリービルドの無人ユニットテストを実行していますが,その中にLAUNCH EXTERNAL PROCESSに依存するものが相当数あり,ひとつでも問題があると,失敗として記録して先へ進むことができないために,外部プロセスを4D側から終了できるよう,PIDパラメーターが追加されました。
ですから,「やりとり」といっても,実際には,起動した外部プロセスが終了したのか,実行中なのかを調べ,もし実行中であれば,(強制的に)終了させることしか想定されていません。「たとえば中止・・・」というドキュメントの記述は,外部プロセスのアボートを示唆しています。
非同期モードの振る舞いですが,たとえば下記(Mac)のような使い方であれば,PIDが返されるはずです。
SET ENVIRONMENT VARIABLE("_4D_OPTION_BLOCKING_EXTERNAL_PROCESS";"false")
C_TEXT($in;$out;$err)
C_LONGINT($pid)
LAUNCH EXTERNAL PROCESS("caffeinate";$in;$out;$err;$pid)
4Dは,毎晩,ナイトリービルドの無人ユニットテストを実行していますが,その中にLAUNCH EXTERNAL PROCESSに依存するものが相当数あり,ひとつでも問題があると,失敗として記録して先へ進むことができないために,外部プロセスを4D側から終了できるよう,PIDパラメーターが追加されました。
ですから,「やりとり」といっても,実際には,起動した外部プロセスが終了したのか,実行中なのかを調べ,もし実行中であれば,(強制的に)終了させることしか想定されていません。「たとえば中止・・・」というドキュメントの記述は,外部プロセスのアボートを示唆しています。
非同期モードの振る舞いですが,たとえば下記(Mac)のような使い方であれば,PIDが返されるはずです。
SET ENVIRONMENT VARIABLE("_4D_OPTION_BLOCKING_EXTERNAL_PROCESS";"false")
C_TEXT($in;$out;$err)
C_LONGINT($pid)
LAUNCH EXTERNAL PROCESS("caffeinate";$in;$out;$err;$pid)
最終編集者 miyako [ 2018-05-16, 5:30 pm ], 編集回数 1 回
miyako- 投稿数 : 468
登録日 : 2016/07/05
Re: LAUNCH EXTERNAL PROCESSからpidが取得できる
Pythonの実行テストを行っていたのですがこんな感じです。なにか勘違いしているのでしょうか?
8206が返ってこないといけないはずなのですが、8212が返ってきています。

8206が返ってこないといけないはずなのですが、8212が返ってきています。

hosaka- 投稿数 : 241
登録日 : 2016/07/04
所在地 : 大阪
Re: LAUNCH EXTERNAL PROCESSからpidが取得できる
ごめんなさい。原因がわかりました。
指摘していたのは以前に起動したプロセスでした。
Macを再起動して再度試してみたところ、ちゃんとPIDが返ってきました。
2回目起動してしまった場合、ドキュメントではPIDが返ってこないと書いてあるのですが何かプロセスを立ち上げてそのPIDが返ってきていたので
勘違いしてしまった様です。
指摘していたのは以前に起動したプロセスでした。
Macを再起動して再度試してみたところ、ちゃんとPIDが返ってきました。
2回目起動してしまった場合、ドキュメントではPIDが返ってこないと書いてあるのですが何かプロセスを立ち上げてそのPIDが返ってきていたので
勘違いしてしまった様です。
hosaka- 投稿数 : 241
登録日 : 2016/07/04
所在地 : 大阪
Permissions in this forum:
返信投稿: 不可
|
|