The Halting Problem is semi-decidable, also called recognizable, and that means there is a Turing Machine $H$ that will, given a Turing Machine $M$ as input, accept $\langle M, s\rangle$ if and only if it halts in finite time on bounded input $s$ and otherwise will reject or fail to halt itself. This means, in a certain sense, that a TM that halts in finite time on an input $s$ can always be recognized as such.
However, there is no upper bound on how long $H$ can run for an arbitrary input $\langle M, s\rangle$. This means the results of $H$ are useful only for establishing that certain machines halt, but never for establishing that other machines don't halt – after all, even after running $H(\langle M, s\rangle)$ for arbitrarily long we cannot say with certainty whether $M$ does not halt on $s$, or whether $H(\langle M, s\rangle)$ just needs more time to compute. Therefore we cannot, with perfect certainty, know which TMs halt and which ones don't – but fixing a string $s$ and running $H$ on different TMs will give us a set of TMs that certainly halt on $s$ that grows the more time $H$ is given.
There is no general procedure for recognizing non-halting TMs: any putative non-halting recognizer will fail to recognize some subset of non-halting TMs as non-halting. However, there are partial recognizers for non-halting: this is the simplest to see with restricted cases of TM. For instance a TM that moves right with every state transition can be determined to never halt if it visits the same state twice after reading to the right of its input.