화면과 관련된 스크립팅을 수행하고 있는데 다음과 같습니다.screen -ls
언제나반품 1. 정상인가요?
스크린 매뉴얼 페이지에는 통과하면 흥미로운 작업이 수행된다고 나와 있지만 screen -ls -q
저는 그렇게 하지 않았습니다(이것이 -q
작동하지 않는 것 같다는 점도 주목할 가치가 있습니다).
알았어 이제 난진짜혼란스러워하세요. Gnu 화면 소스를 보고 있습니다.
if (lsflag) {
int i, fo, oth;
if (multi)
real_uid = multi_uid;
SET_GUID();
i = FindSocket((int *)NULL, &fo, &oth, SocketMatch);
if (quietflag) {
if (rflag)
exit(10 + i);
else
exit(9 + (fo || oth ? 1 : 0) + fo);
}
if (fo == 0)
Panic(0, "No Sockets found in %s.\n", SocketPath);
Msg(0, "%d Socket%s in %s.", fo, fo > 1 ? "s" : "", SocketPath);
eexit(0);
}
lsflag
-l
또는 명령을 실행하면 -ls
설정은 eexit
다음과 같습니다.
void eexit(int e)
{
if (ServerSocket != -1) {
if (setgid(real_gid))
AddStr("Failed to set gid\r\n");
if (setuid(real_uid))
AddStr("Failed to set uid\r\n");
if (unlink(SocketPath))
AddStr("Failed to remove socket\r\n");
}
exit(e);
}
1 도 반환하면 안 됩니다 screen -ls
.
답변1
소스를 더 자세히 살펴보면 답이 나왔습니다. 항상 그렇듯이 이는 데비안이 핵심 구성 요소의 이전 버전을 출시하기 때문입니다.
if (lsflag)
{
int i, fo, oth;
#ifdef MULTIUSER
if (multi)
real_uid = multi_uid;
#endif
SET_GUID();
i = FindSocket((int *)NULL, &fo, &oth, SockMatch);
if (quietflag) {
if (rflag)
exit(10 + i);
else
exit(9 + (fo || oth ? 1 : 0) + fo);
}
if (fo == 0)
Panic(0, "No Sockets found in %s.\n", SockPath);
Panic(0, "%d Socket%s in %s.\n", fo, fo > 1 ? "s" : "", SockPath);
/* NOTREACHED */
}
그 중 패닉은 다음과 같다
void Panic (int err, const char *fmt, VA_DOTS)
{
char buf[MAXPATHLEN*2];
PROCESS_MESSAGE(buf);
debug3("Panic('%s'); display=%x displays=%x\n", buf, display, displays);
if (displays == 0 && display == 0)
{
printf("%s\r\n", buf);
if (PanicPid)
Kill(PanicPid, SIG_BYE);
}
else if (displays == 0)
{
/* no displays but a display - must have forked.
* send message to backend!
*/
char *tty = D_usertty;
display = 0;
SendErrorMsg(tty, buf);
sleep(2);
_exit(1);
}
else
for (display = displays; display; display = display->d_next)
{
if (D_status)
RemoveStatus();
FinitTerm();
Flush(3);
#ifdef UTMPOK
RestoreLoginSlot();
#endif
SetTTY(D_userfd, &D_OldMode);
fcntl(D_userfd, F_SETFL, 0);
write(D_userfd, buf, strlen(buf));
write(D_userfd, "\n", 1);
freetty();
if (D_userpid)
Kill(D_userpid, SIG_BYE);
}
#ifdef MULTIUSER
if (tty_oldmode >= 0)
{
# ifdef USE_SETEUID
if (setuid(own_uid))
xseteuid(own_uid); /* may be a loop. sigh. */
# else
setuid(own_uid);
# endif
debug1("Panic: changing back modes from %s\n", attach_tty);
chmod(attach_tty, tty_oldmode);
}
#endif
eexit(1);
}
Panic()
멤버를 통해 전달된 오류 코드를 반환하지 않는 이유에 대해서는 err
귀하의 추측도 내 것과 같습니다. -Q
존재하기는 하지만 이 주장 역시 무너진 것 같습니다.
기본적으로 버전이 apt
깨졌습니다.