diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2017-03-21 16:50:06 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2017-03-22 13:56:10 +0000 |
commit | a985521b39a947f293f070e3d321bd436a391e00 (patch) | |
tree | e4e8450fa32b6f2320216d98c2dadb20e692db49 /src/plugins/remotelinux/remotelinuxsignaloperation.cpp | |
parent | 2092d576765eedf67f476481de4b01c748cb857e (diff) |
RemoteLinux: Always kill the whole process group
This way we can get rid of processes spawned from an initial shell, e.g.
in case of the perf profiler. Also, if your target application spawns
additional processes, we probably want to kill those. The kill -pgid
only works if the target application is actually the process group
leader. So, in case it isn't, also kill it individually by pid.
Change-Id: Ifcaf3764d21281c3cac107419f84f6bc527854da
Task-number: QCE-91
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Diffstat (limited to 'src/plugins/remotelinux/remotelinuxsignaloperation.cpp')
-rw-r--r-- | src/plugins/remotelinux/remotelinuxsignaloperation.cpp | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/src/plugins/remotelinux/remotelinuxsignaloperation.cpp b/src/plugins/remotelinux/remotelinuxsignaloperation.cpp index 7c71c3c143..b59118b4aa 100644 --- a/src/plugins/remotelinux/remotelinuxsignaloperation.cpp +++ b/src/plugins/remotelinux/remotelinuxsignaloperation.cpp @@ -49,9 +49,9 @@ RemoteLinuxSignalOperation::~RemoteLinuxSignalOperation() } } -static QString signalProcessByPidCommandLine(qint64 pid, int signal) +static QString signalProcessGroupByPidCommandLine(qint64 pid, int signal) { - return QString::fromLatin1("kill -%1 %2").arg(signal).arg(pid); + return QString::fromLatin1("kill -%1 -- -%2 %2").arg(signal).arg(pid); } void RemoteLinuxSignalOperation::run(const QString &command) @@ -72,32 +72,32 @@ void RemoteLinuxSignalOperation::finish() emit finished(m_errorMessage); } -static QString signalProcessByNameCommandLine(const QString &filePath, int signal) +static QString signalProcessGroupByNameCommandLine(const QString &filePath, int signal) { return QString::fromLatin1( "cd /proc; for pid in `ls -d [0123456789]*`; " "do " "if [ \"`readlink /proc/$pid/exe`\" = \"%1\" ]; then " - " kill -%2 $pid;" + " kill -%2 -- -$pid $pid;" "fi; " "done").arg(filePath).arg(signal); } QString RemoteLinuxSignalOperation::killProcessByNameCommandLine(const QString &filePath) const { - return QString::fromLatin1("%1; %2").arg(signalProcessByNameCommandLine(filePath, 15), - signalProcessByNameCommandLine(filePath, 9)); + return QString::fromLatin1("%1; %2").arg(signalProcessGroupByNameCommandLine(filePath, 15), + signalProcessGroupByNameCommandLine(filePath, 9)); } QString RemoteLinuxSignalOperation::interruptProcessByNameCommandLine(const QString &filePath) const { - return signalProcessByNameCommandLine(filePath, 2); + return signalProcessGroupByNameCommandLine(filePath, 2); } void RemoteLinuxSignalOperation::killProcess(qint64 pid) { - run(QString::fromLatin1("%1; sleep 1; %2").arg(signalProcessByPidCommandLine(pid, 15), - signalProcessByPidCommandLine(pid, 9))); + run(QString::fromLatin1("%1; sleep 1; %2").arg(signalProcessGroupByPidCommandLine(pid, 15), + signalProcessGroupByPidCommandLine(pid, 9))); } void RemoteLinuxSignalOperation::killProcess(const QString &filePath) @@ -107,7 +107,7 @@ void RemoteLinuxSignalOperation::killProcess(const QString &filePath) void RemoteLinuxSignalOperation::interruptProcess(qint64 pid) { - run(signalProcessByPidCommandLine(pid, 2)); + run(signalProcessGroupByPidCommandLine(pid, 2)); } void RemoteLinuxSignalOperation::interruptProcess(const QString &filePath) |