C ++プログラムにシグナルハンドラがあります。
void term(int signum)
{
cout << "in term" << endl;
# Do Stuff
exit(0);
}
int main(int argc, char *argv[])
{
# Do Stuff
signal(SIGINT, term);
# Do Stuff
}
プログラムはうまく動作します。押してCtrl+Cいくと機能項目に入ります。
ただし、スクリプトを使用してその動作を複製しようとすると機能しません。
私が実行しているスクリプトの単純化されたバージョンは次のとおりです。
! /bin/bash
sudo ./program &
rpid=$!
sleep 2
sudo kill -INT $rpid
# sudo kill -TERM $rpid
# sudo kill $rpid
echo "killed"
wait $rpid
プログラムは、を押すまで用語機能を入力しませんCtrl+C。無限大気状態で止まっています。
答え1
% sudo sh -c 'exec echo 私のプロセスIDは$$です。 '&echo "XyrプロセスIDは$\!です。" [1]59130 XyrプロセスIDは59130です。 私のプロセスIDは59131です。 [1] +完了 sudo sh -c 'exec echo 私のプロセスIDは$$です。 ' %
プラグ型認証モジュールの世界へようこそ!login
、su
などのプログラムは、sudo
対象プログラムと重複しなくなります。
間違ったプロセスに信号を送信しています。
追加読書
- ジョナサンデボインポラード(2014)。 「20年前にPAMがすべてを変えました。」。ユーザー権限を削除するためにsuを乱用しないでください。。一般的な答え。
- sudo + execをどのように実行しますか?