2 votos

¿Qué especifica una sesión tachada, coloreada en rojo, en Termux?

He experimentado múltiples sesiones de Termux que no responden en Oneplus 5T por nada más intenso que abrir unas cinco páginas web en lynx (cada uno en su propia... de nuevo, sesión en tmux ; Ctrl + B , C en el teclado).

He esperado varios días y las sesiones no parecen recuperarse.

¿Las siguientes sesiones se han bloqueado por completo o Termux considera que están en algún estado de congelación?

screenshot

1voto

Andrew T. Puntos 2107

Según el código fuente, las sesiones tachadas en rojo son sesiones que han terminado de ejecutarse con un código de salida distinto de cero (por ejemplo, sesión muerta).


El TermuxSessionsListViewController maneja la interfaz de usuario de la lista de sesiones:

  • Si la sesión no se está ejecutando, entonces tachará el texto
  • Si la sesión no se está ejecutando y tiene un estado de salida distinto de cero, se coloreará en rojo

    TerminalSession sessionAtRow = getItem(position).getTerminalSession();

    ...

    boolean sessionRunning = sessionAtRow.isRunning();

    if (sessionRunning) { sessionTitleView.setPaintFlags(sessionTitleView.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG); } else { sessionTitleView.setPaintFlags(sessionTitleView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); } int defaultColor = shouldEnableDarkTheme ? Color.WHITE : Color.BLACK; int color = sessionRunning || sessionAtRow.getExitStatus() == 0 ? defaultColor : Color.RED; sessionTitleView.setTextColor(color);

El TerminalSession maneja la lógica, incluyendo cuando se considera que ha terminado de ejecutarse (PID = -1) con su código de salida.

/** The pid of the shell process. 0 if not started and -1 if finished running. */
int mShellPid;

/** The exit status of the shell process. Only valid if ${@link #mShellPid} is -1. */
int mShellExitStatus;

...

/** Cleanup resources when the process exits. */
void cleanupResources(int exitStatus) {
    synchronized (this) {
        mShellPid = -1;
        mShellExitStatus = exitStatus;
    }

    ...

}

...

public synchronized boolean isRunning() {
    return mShellPid != -1;
}

/** Only valid if not {@link #isRunning()}. */
public synchronized int getExitStatus() {
    return mShellExitStatus;
}

...

@SuppressLint("HandlerLeak")
class MainThreadHandler extends Handler {

    ...

    @Override
    public void handleMessage(Message msg) {

        ...

        if (msg.what == MSG_PROCESS_EXITED) {
            int exitCode = (Integer) msg.obj;
            cleanupResources(exitCode);

            String exitDescription = "\r\n[Process completed";
            if (exitCode > 0) {
                // Non-zero process exit.
                exitDescription += " (code " + exitCode + ")";
            } else if (exitCode < 0) {
                // Negated signal.
                exitDescription += " (signal " + (-exitCode) + ")";
            }
            exitDescription += " - press Enter]";

            byte[] bytesToWrite = exitDescription.getBytes(StandardCharsets.UTF_8);
            mEmulator.append(bytesToWrite, bytesToWrite.length);
            notifyScreenUpdate();

            mClient.onSessionFinished(TerminalSession.this);
        }
    }

}

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X