Don't use Process#exit() to avoid exit code 9.

Process#exit() seems to cause syncthing to return exit code 9 all
the time. Using SIGINT instead always gives a clean exit (at least
on my Android 6 device).
This commit is contained in:
Felix Ableitner 2016-03-11 23:00:23 +01:00
parent 963704778a
commit 91f9231501
1 changed files with 5 additions and 19 deletions

View File

@ -217,21 +217,9 @@ public class SyncthingRunnable implements Runnable {
/** /**
* Look for running libsyncthing.so processes and kill them. * Look for running libsyncthing.so processes and kill them.
* Try a SIGTERM once, then try again (twice) with SIGKILL. * Try a SIGINT first, then try again with SIGKILL.
*/ */
public void killSyncthing() { public void killSyncthing() {
final Process p = mSyncthing.get();
if (p != null) {
mSyncthing.set(null);
p.destroy();
try {
p.waitFor();
} catch (InterruptedException e) {
Log.w(TAG_KILL, "Failed to kill Syncthing's process", e);
}
}
// Ensure kill
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
Process ps = null; Process ps = null;
DataOutputStream psOut = null; DataOutputStream psOut = null;
@ -269,18 +257,18 @@ public class SyncthingRunnable implements Runnable {
* *
* @param force Whether to use a SIGKILL. * @param force Whether to use a SIGKILL.
*/ */
private static void killProcessId(String id, boolean force) { private void killProcessId(String id, boolean force) {
Process kill = null; Process kill = null;
DataOutputStream killOut = null; DataOutputStream killOut = null;
try { try {
kill = Runtime.getRuntime().exec("sh"); kill = Runtime.getRuntime().exec((useRoot()) ? "su" : "sh");
killOut = new DataOutputStream(kill.getOutputStream()); killOut = new DataOutputStream(kill.getOutputStream());
if (!force) { if (!force) {
killOut.writeBytes("kill " + id + "\n"); killOut.writeBytes("kill -SIGINT " + id + "\n");
killOut.writeBytes("sleep 1\n"); killOut.writeBytes("sleep 1\n");
} else { } else {
killOut.writeBytes("sleep 3\n"); killOut.writeBytes("sleep 3\n");
killOut.writeBytes("kill -9 " + id + "\n"); killOut.writeBytes("kill -SIGKILL " + id + "\n");
} }
killOut.writeBytes("exit\n"); killOut.writeBytes("exit\n");
killOut.flush(); killOut.flush();
@ -322,8 +310,6 @@ public class SyncthingRunnable implements Runnable {
mErrorLog += line + "\n"; mErrorLog += line + "\n";
} }
} catch (IOException e) { } catch (IOException e) {
// NOTE: This is sometimes called on shutdown, as
// Process.destroy() closes the stream.
Log.w(TAG, "Failed to read Syncthing's command line output", e); Log.w(TAG, "Failed to read Syncthing's command line output", e);
} }
} }