コンピュータがあり、Wi-Fi インターフェイスで tcpdump を実行するには sudo 権限が必要です。したがって、このようなバックグラウンドジョブを実行すると、
sudo tcpdump -i wlp8s0 'port 80' &
(何の出力も得られないので、これは無意味であることを知っていますが、考えてみましょう)
したがって、ルートではなくユーザーのスコープで開始されたバックグラウンドプロセスを終了する必要がある場合は、通常次のようにします。
Kill %1 ###1 はバックグラウンドジョブ番号です。
ただし、これはその操作が許可されていないことを意味します。
それでは私はこれをします。
Sudoが%1を殺しました
ただし、これはrootユーザーが開始したバックグラウンドジョブを終了する必要があるのと同じです(そうではありません)。
実際には、ジョブのプロセスIDを取得してそれを使用して終了する必要があります。
root以外のユーザーを使用してsudoの範囲内で作業を開始し、残忍ではなく正常に終了する方法についてのアイデアはありますか?
答え1
あなたはそれを使用することができます
sudo kill "$!"
最近開始されたバックグラウンドジョブを終了します。
仕事を始めると簡単になります。
sudo tcpdump ... & pid="$!"
それから
sudo kill "$pid"
特定のタスクを終了します。
プロセスsudo
自体はあなたのプロセスのように実行されますが、すべての信号を子プロセス(この場合)に渡しますtcpdump
。つまり、プロセスを終了するには、シグナルを送信するための適切な権限が必要です。
sudo
マニュアルで(Ubuntuシステムの場合):
I / Oロギングプラグインが設定されている場合、またはセキュリティポリシーから明示的に要求された場合は、新しい擬似端末(「pty」)が作成され、2番目のsudoプロセスを使用して、ユーザーの既存のptyと新しいpty制御の間でタスクを渡します。シグナル pty がコマンドを実行しています。この追加プロセスにより、コマンドを一時停止して再開できます。
[...]
コマンドがsudoプロセスの子として実行されると、sudoは受信した信号をコマンドに渡します。 SIGINT および SIGQUIT シグナルは、コマンドが新しい pty で実行される場合、またはカーネルではなくユーザー・プロセスによってシグナルが送信される場合にのみ送出されます。