반응형

출처 : https://superuser.com/questions/98974/how-to-use-crontab-to-run-a-script-as-nobody

nobody로 스크립트 실행하기 위해 crontab 사용하는 방법

이는 CentOS 머신입니다. 저는 매일 특정 시간에 (최소 권한으로 사용자로써) 사용자 nobody로 스크립트를 실행하려 합니다. 여기에 nobody가 있습니다.

[root@CentOS % ~] grep "^nobody" /etc/passwd  
nobody:x:99:99:Nobody:/:/sbin/nologin  

루트의 crontab에서 제가 실행하려 한 것입니다.

환경변수 SUDO_USER=nobody로 설정하고
15 17 * * * sudo -u nobody /bin/bash /usr/local/bin/bashscript.sh
15 17 * * * su -c /usr/local/bin/bashscript.sh nobody

저는 모두 가능한 루트의 crontab에 엔트리를 유지하고 싶습니다. 나는 또한 해당 설정에 의존할 수 있는 다른 어떤 것도 깨뜨리고 싶지 않기 때문에 아무도 nobody의 계정을 속이지 않는 것을 선호합니다. 나는 권한이 없는 다른 계정을 만들고 그것이 문제가 되는 경우 실제 쉘을 제공하는 것에 반대하지 않습니다.

저도 약간 당혹스러웠던 점은 인정합니다. 도움이 되지 않는다는 점을 제외하고는 이것이 일상적인 문제라고 가정합니다.

5개의 답변

저는 crontab -e 또는 crontab -l 내용에서 당신이 작성했다고 가정합니다?

이것은 사용자 "루트"에 속한 crontab 파일이며 해당 파일은 (일반적으로 개인 작업을 예약하는 데 사용되는 파일) 명령을 실행할 사용자 지정을 지원하지 않습니다 .
시스템 전체의 crontab이고 추가 필드인 사용자 필드가 있는 /etc/crontab을 보십시오. /etc/crontab에 다음과 같은 줄을 추가해 보십시오.

15 17 * * * nobody /usr/local/bin/bashscript.sh
반응형
반응형

출처 : https://stackoverflow.com/questions/42988977/what-is-the-purpose-of-pip-install-user

"pip install --user ..."의 목적은?

pip install --help 로부터

--user 당신의 플랫폼의 Python 사용자 설치 디렉터리에 설치합니다. 일반적으로 ~/.local/, 또는 윈도우즈는 %APPDATA$\Python입니다. (전체 세부사항은 site.USER_BASE Python 문서를 보세요.)

site.USER_BASE 문서는 제가 이해하지 못하는 흥미로운 NIX 주제이며 무시무시 합니다.

일반 영어로 --user의 목적은 무엇입니까? 왜 패키지는 ~/.local에 설치되나요? 왜 저의 $PATH에 어딘가 실행 프로그램을 놓지 않을까요?


8개 답변 중 1개

pip는 기본적으로 (/usr/local/lib/python3.4 같은) 시스템 디렉터리에 Python 패키지를 설치합니다. 이는 root 권한이 필요합니다.

pip의 --user는 대신에 당신의 home 디렉터리에 패키지를 설치합니다. 이는 특별한 권한을 요구하지 않습니다.

추가 참고주소 : https://scicomp.stackexchange.com/questions/2987/what-is-the-simplest-way-to-do-a-user-local-install-of-a-python-package

반응형
반응형

출처 : http://blog.tanelpoder.com/2009/01/22/identifying-shared-memory-segment-users-using-lsof/

lsof를 사용하여 공유메모리 사용자를 식별하기

lsof(열린 파일의 목록을 보여주는 프로그램)은 지워진 파일의 해제 또는 공유메모리의 삭제를 방해하는 열려있는 파일 디스크립터의 문제를 해결하는데 매우 유용한 도구입니다.

이 예시는 리눅스에서 Oracle 사용자의 공유메모리가 해제되지 않고 아직 사용중이라고 표시되고 있는 상황입니다.

$ ipcs -ma

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x00000000 393216     oracle    640        289406976  1          dest
0xbfb94e30 425985     oracle    640        289406976  18
0x3cf13430 557058     oracle    660        423624704  22

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0xe2260ff0 1409024    oracle    640        154
0x9df96b74 1671169    oracle    660        154

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

진하게 표시된 줄은 인스턴스가 닫힌 후에 사라져야 하지만 그렇지 못했습니다. "nattch"(공유메모리에 접근한 프로세스들의 수)로부터 저는 공유메모리를 사용하는 몇개의 프로세스가 아직 있다는 것을 알았습니다. 그래서 이 조각은 해제되지 않았고 ipcrm 명령어조차 그것(누군가 파일들을 열었다면 정상 파일인것처럼)을 삭제할 수 없었습니다.

그래서 이 공유메모리를 사용하는 프로세스를 식별할 필요가 있었습니다. 만약 보통 존재하는 파일이었다면 어떤 프로세스가 그 파일을 열었는지 /sbin/fuser 명령을 사용했겠지만 이 명령은 디렉터리에서 현재 존재하는 파일에 대해서만 작동합니다.

하지만 지워진 파일, 소켓이나 공유 메모리를 위해서는 lsof 명령을 사용할 수 있습니다. (보통 리눅스에 기본으로 설치되어 있지만 Unix에서는 별도로 다운로드 받아 설치해야 합니다.)

ipcs -ma가 보여주듯이 사용중인 SHM ID는 393216이며 저는 SHM ID를 grep하여 모든 열여 있는 파일 디스크립터를 보여주도록 lsof를 다음처럼 실행하였습니다.

$ lsof | egrep "393216|COMMAND"
COMMAND     PID      USER   FD      TYPE     DEVICE       SIZE       NODE NAME
python    18811    oracle  DEL       REG        0,8                393216 /SYSVbfb94e30

NODE 열에 대응되는 ipcs의 출력된 SHM ID와 대응되는지 알 수 있습니다.
그래서 저는 아직 SHM 에 접근 중인 PID 18811을 kill 하였습니다.

$ kill 18811

$ ipcs -ma

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0xbfb94e30 425985     oracle    640        289406976  18
0x3cf13430 557058     oracle    660        423624704  25

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0xe2260ff0 1409024    oracle    640        154
0x9df96b74 1671169    oracle    660        154

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

해당 공유메모리가 사라지고 해제되었습니다.

명령은 다른 작업을 하는데도 매우 유용합니다. 예를 들어, 네트워크 프로토콜, IP, port 등 열여 있는 소켓을 보여주기도 합니다. 예를 들어 OS level에서 어떤 클라이언트가 서버 프로세스와 통신하는 지 확인 할 수 있습니다.

$ lsof -i:1521
COMMAND   PID   USER   FD   TYPE DEVICE SIZE NODE NAME
tnslsnr  6212 oracle   11u  IPv4  49486       TCP *:1521 (LISTEN)
tnslsnr  6212 oracle   13u  IPv4 276708       TCP linux03:1521->linux03:37277 (ESTABLISHED)
tnslsnr  6212 oracle   14u  IPv4 264894       TCP linux03:1521->linux03:41122 (ESTABLISHED)
oracle  22687 oracle   20u  IPv4 264893       TCP linux03:41122->linux03:1521 (ESTABLISHED)
oracle  25250 oracle   15u  IPv4 276707       TCP linux03:37277->linux03:1521 (ESTABLISHED)
oracle  25530 oracle   15u  IPv4 279910       TCP linux03:1521->192.168.247.1:nimsh (ESTABLISHED)

불행히도 lsof는 클래식 유닉스에서 기본적으로 설치되지 않지만 일부에서는 시스템 관리자가 설치하기로 선택했습니다. 그러나 lsof는 /dev/kmem 또는 이와 유사한 것을 통해 커널 메모리 구조에 액세스해야 하므로 일반 사용자에게는 작동하지 않을 수 있습니다. lsof에 액세스할 수 없다면 lsof가 할 수 있는 몇 가지 트릭을 수행할 수 있는 다른 도구가 있을 수 있습니다. 예를 들어 Solaris에는 프로세스의 열린 파일을 표시할 수 있는 유용한 명령 pfiles가 있으며 (내 생각에는) Solaris 9 부터 네트워크 소켓의 TCP 연결 endpoint도 보고할 수 있습니다…

반응형

+ Recent posts