プログラムをフォアグラウンドで強制的に実行する方法

プログラムをフォアグラウンドで強制的に実行する方法

プロセスを自動的にデーモン化し、バックグラウンドで実行するプログラムがあります。

このプログラムを強制的にフォアグラウンドで実行する方法はありますか?これをスクリプトに入れて、戻りコードをキャプチャして正常に終了することを確認したいと思います。

答え1

プロセスがデーモン化されると、自分を分岐し(少なくとも1回)、親プロセスがすぐに返され、子プロセスが操作を完了します。

その子が死んだら、もう親はいません。またはむしろinit(id 1のプロセス)によって採用されました。init終了ステータスを取得できます。

Linuxでは、カーネル3.4以降、次のコマンドを使用して、孤児プロセス(子と子について)を採用するプロセスを変更できます。PR_SET_CHILD_SUBREAPER prctl()

だから、非常に似た質問と回答、Linux 3.4+では子供用収穫機そして孤児となった子孫の終了状態を報告するようにします。

ここで使用してperlハードコードされた値は次のとおりですPR_SET_CHILD_SUBREAPER prctl()

perl -MPOSIX -le '
  require "syscall.ph";
  syscall(&SYS_prctl,36,1) >= 0 or die "cannot set subreaper: $!";
  if (!fork) {
    exec @ARGV;
    exit(127);
  }
  # now reporting on all children and grand-children:
  while (($pid = wait) > 0) {
   print "$pid: " . WEXITSTATUS($?)
  }' your-daemon here

答え2

これがたまにデバッグのためのものであると仮定して終了コードをキャプチャする場合は、最終デーモンのプロセスIDを知っている場合は、ここに追加して終了strace -pするまでこのように追跡できます。

たとえば、終了する前にpidを取得する時間がない場合は、次のコマンドを実行してstrace -f子プロセスを追跡できます。単純なデーモンのデモはありませんが、次の例でどのように機能するかを確認できます。

$ strace -f -e exit bash -c 'nohup bash -c "sleep 10; exit 2" &'
strace: Process 9688 attached
[pid  9687] +++ exited with 0 +++
nohup: appending output to 'nohup.out'
strace: Process 9689 attached
[pid  9689] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=9689, si_uid=127, si_status=0, si_utime=0, si_stime=0} ---
+++ exited with 2 +++

ここでは、内部の「daemon」bashコマンドで終了コード2を正常に収集したことを確認できます。


またはあなたが持っているならシステム、別のcgroupでコマンドを実行してみることができます。

$ systemd-run --user --service-type=forking  bash -c '(sleep 99;exit 2)& exit 0'
Running as unit run-8772.service.

ポーリング以外に生成された終了コードを収集する方法がわかりません。早すぎると、デーモンはまだアクティブです。

$ systemctl --user status run-8772
  ...
   Active: active (running) since Wed 2017-03-29 18:56:43 CEST; 14s ago
   CGroup: /user.slice/user-1000.slice/[email protected]/run-8772.service
       |-8774 /usr/bin/bash -c (sleep 99;exit 2)& exit 0
       `-8775 sleep 99

適切な遅延の後、プロセスは終了し、目的の終了コードにアクセスできます。

$ systemctl --user status run-8772
   Active: failed (Result: exit-code) since Wed 2017-03-29 18:58:22 CEST; 3s ago
 Main PID: 8774 (code=exited, status=2)

関連情報