ç´°ãããã¦ä¼ãããªãPerlã¨$0夿° - ã³ãã³ãåå½è£
å æ¥ãmoznionæ°ã®ã実行中のプログラムの進捗度を手っ取り早く確認したいãã¨ããé¢ç½ãè¨äºãèªã¿ã¾ããã
ããã«å½±é¿ããã¦ãPerlã¨$0ã®ã¦ã³ãã¯ã id:lesamoureuses ã«èªã£ãã¨ããå°å³ã«ã¦ã±ãè¯ãã£ãã®ã§ãããã«èª¿åã«ä¹ã£ã¦ãç´°ãããã¦ä¼ãããªãPerlã¨$0ã®é¢ä¿ã«ã¤ãã¦èªãã¾ãããªããæ¬ç¨¿ã®å®ç¨æ§ã¯ãã¾ãããã¾ããããã¡ãã£ã¨ã ãããã¾ãã
æ¦è¦
ä¸è¿°ã®moznionæ°ã®ããã°ã¯ãRubyã§$0ããããã¨psã³ãã³ãã§è¦ããã³ãã³ãåãå¤ãã£ã¦ä¾¿å©ãã¨ãã話ã§ãã(ãã¢ãã¢ãã)ã
Perlã§ãåæ§ã«ã$0ãããããã¨ã§psã³ãã³ãã§è¦ããCOMMANDå¤ãå¤ãããã¨ãã§ãã¾ã(ãªãææåéããã人ããã¾ãããå ã®ãã¡ã¤ã«åã¯å¤ããã¾ãããpsã³ãã³ãã§è¦ããå¤ã ãã§ã)ããã ãããã¯OSã«ãã£ã¦çµæ§åä½ãéãã®ã§ã以ä¸ãã°ããLinux(CentOS)éå®ã®è©±ããã¾ãã
é常ãPerlã¹ã¯ãªãããå®è¡ä¸ã«psã³ãã³ãã§è¦ãã¨ã次ã®ããã«ã[perlã¤ã³ã¿ããªã¿] [ã¹ã¯ãªãããã¡ã¤ã«å]ãã®å½¢ã§è¦ãã¾ãã
[ozuma@cent6 ~]$ ps x PID TTY STAT TIME COMMAND ....(çç¥).... 1842 pts/0 S+ 0:00 /usr/bin/perl ./script.pl 1843 pts/1 R+ 0:00 ps x [ozuma@cent6 ~]$
ã§ã¯ããã§ã次ã®ããã«Perlã¹ã¯ãªããå ã§ã$0ã«"notepad.exe"ã¨ããå¤ãä»£å ¥ãã¦ã¿ã¾ãããã
#!/usr/bin/perl use strict; use warnings; $0 = "notepad.exe"; sleep 100;
ãã®ç¶æ ã§å¥ç«¯æ«ããpsã³ãã³ããå®è¡ããã¨ãã¾ãã§notepad.exeãå®è¡ãã¦ããããã«è¦ãã¾ãã
[ozuma@cent6 ~]$ ps x PID TTY STAT TIME COMMAND ....(çç¥).... 1834 pts/0 S+ 0:00 notepad.exe 1835 pts/1 R+ 0:00 ps x [ozuma@cent6 ~]$
ãã®åãã¯ãPerldocã® Perlの組み込み変数 $0 の翻訳 - perldoc.jp ã«ãã¯ã£ããæ¸ããã¦ãã¾ãã
psã³ãã³ãã®å®è£
ãªããããªãã¨ãèµ·ããããçè§£ããã«ã¯ãLinuxã®psã³ãã³ãã®å®è£ ãç¥ãå¿ è¦ãããã¾ãã
Linux(CentOS)ã§ã¯ãpsã³ãã³ãã¯procpsã¨ããããã±ã¼ã¸ã«å ¥ã£ã¦ãã¾ãã
[ozuma@cent6 fork]$ rpm -qf /bin/ps procps-3.2.8-25.el6.x86_64
procpsの公式ページããpsã³ãã³ãã®ã½ã¼ã¹ã³ã¼ããè¦ã¦ã¿ãã¨ãããã¯å é¨ã§/procé ä¸ã®ãã¡ã¤ã«ãèªãã§ããããã§ãããããã¯ãã½ã¼ã¹ã³ã¼ãèªãã®ã¡ã³ãã¯ã»ã¼ã¨ãã人ã¯ãstraceãä»ãã¦psã³ãã³ããå®è¡ãã¦ã¿ãã°ããåããã¾ãã
$ strace ps x
....(çç¥)....
stat("/proc/1945", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
open("/proc/1945/stat", O_RDONLY) = 5
read(5, "1945 (strace) R 1706 1945 1706 3"..., 1023) = 224
close(5) = 0
open("/proc/1945/status", O_RDONLY) = 5
read(5, "Name:\tstrace\nState:\tR (running)\n"..., 1023) = 894
close(5) = 0
open("/proc/1945/cmdline", O_RDONLY) = 5
read(5, "strace\0ps\0x\0", 2047) = 12
close(5) = 0
....(çç¥)....ãã®ããã«ãpsã³ãã³ãã§ã¯/proc/(ããã»ã¹ID)/cmdlineã¨ããprocãã¡ã¤ã«ããã表示ããCOMMANDåãåå¾ãã¦ãã¾ããå®éãPerlã¹ã¯ãªããä¸ã§$0ãæ¸ãæããã¨ããã®æç¹ã§cmdlineãã¡ã¤ã«ã®å å®¹ãæ¸ãæãããã¨ãåããã¾ã(ã®ã§ãåèªãã£ã¦ã¿ã¦ãã ãã)ã
ãã ããprocãã¡ã¤ã«ã«ã¯ããä¸ã¤ãcommã¨ãããã¡ã¤ã«ãããã¾ãããã¡ãã¯$0ãæ¸ãæãã¦ãå¤ããã¾ãã(ã®ã§ããããåèªãã£ã¦ã¿ã¦ãã ãã)ã
ããã¾ã§ã®ã¾ã¨ã
| ãã¡ã¤ã«å | è§£é |
|---|---|
| /proc/(ããã»ã¹ID)/cmdline | $0ã§æ¸ãæãå¯è½ãpsã³ãã³ãã§è¦ããå¤ |
| /proc/(ããã»ã¹ID)/comm | $0ã§ã¯å¤ãããªãã |
æ¸ãæããããcmdlineã¨å¤ãããªãcomm
å ã»ã©ããpsã³ãã³ãã¯procãã¡ã¤ã«ã®cmdlineãèªããã¨æ¸ãã¾ããããããã¯æ£ç¢ºã§ã¯ããã¾ãããæ£ããã¯ãã(ä¸è¬çãªãªãã·ã§ã³ãä»ãã¦)psã³ãã³ããå®è¡ããã¨ãprocãã¡ã¤ã«ã®cmdlineãèªãããæ£è§£ã§ãã
å®ã¯ãpsã³ãã³ãå®è¡æã«cã¨ãã誰ãç¥ããªããã¤ãã¼ãªãªãã·ã§ã³ãä»ããã¨ãcommã®æ¹ã表示ãã¾ããããã¯manã§ã¯ããæ¬å½ã®ã³ãã³ãåã表示ãã(Show the true command name)ãã¨è¡¨ç¾ããã¦ãã¾ãã
[ozuma@cent6 ~]$ ps x PID TTY STAT TIME COMMAND 1597 ? S 0:00 sshd: ozuma@pts/0 1598 pts/0 Ss 0:00 -bash 2065 ? S 0:00 sshd: ozuma@pts/1 2066 pts/1 Ss 0:00 -bash 2096 pts/0 S+ 0:00 notepad.exe 2097 pts/1 R+ 0:00 ps x [ozuma@cent6 ~]$ ps cx PID TTY STAT TIME COMMAND 1597 ? S 0:00 sshd 1598 pts/0 Ss 0:00 bash 2065 ? S 0:00 sshd 2066 pts/1 Ss 0:00 bash 2096 pts/0 S+ 0:00 script.pl 2098 pts/1 R+ 0:00 ps [ozuma@cent6 ~]$
ä¸ã®ä¾ã§ãPID=2096ã®ããã»ã¹ã¯ãã¯ããã¯notepad.exeã«è¦ãã¾ããããæ¬¡ã®cãªãã·ã§ã³ã§ã¯script.plã«è¦ãã¾ããåãã®ç®ãã¯ããã¾ããã
ããä¸ã¤ãpsã³ãã³ãã§ã¯ç¡ãpstreeã³ãã³ãã使ã£ã¦ãç°¡åã«å ã®ã³ãã³ãåãè¦ããã¨ãã§ãã¾ãã
[ozuma@cent6 ~]$ pstree
initââ¬âNetworkManager
ââVBoxServiceâââ7*[{VBoxService}]
....(çç¥)....
âârsyslogdâââ3*[{rsyslogd}]
ââsshdââ¬âsshdâââsshdâââbashâââscript.pl
â ââsshdâââsshdâââbashâââpstree
ââudevdâââ2*[udevd]
ââwpa_supplicant
[ozuma@cent6 ~]$ããã¯ãpstreeã³ãã³ãã¯/proc/(ããã»ã¹ID)/statãã¡ã¤ã«ãèªã¿è¾¼ã¿ããããã³ãã³ãåãåå¾ããã®ã§ã/proc/(ããã»ã¹ID)/cmdlineã¯èªã¾ãªãããã§ãããã®ããã$0æ¸ãæãã¯pstreeã³ãã³ãã«ã¯å¹ãã¾ããã
$0ãæ¸ãæããç®ç
ãã®$0ã¯ãããã°ã©ã ã®åä½ç¶æ ã表示ããããã«ä½¿ãã®ãä¸çªã¾ã£ã¨ããªããæ¹ã§ããä¾ãã°ãå®è¡ç¶æ ã«ãã£ã¦script.pl(run)ã¨script.pl(wait)ã®ããã«$0ãé©å®æ¸ãæããã°ãpsã§ç£è¦ãã¦ãã人ã¯åãããããã¦ãããã¼ã§ãã
ããä¸ã¤ã$0æä½ã¯psã³ãã³ãããã®é è½ç®çã§ããã使ããã¾ããå ·ä½çã«ã¯ãPerlã§ãã«ã¦ã§ã¢ãæ¸ãã¦ãã人ãã¡ã®éã§ã¯ããã®$0ããããããã®ã¯å¸¸å¥ææ®µã§ãããã使ãããææ³ã§ãã
以ä¸ã¯ã以åã«åéãããPHPã®èå¼±æ§ãçã£ã¦éãè¾¼ã¾ãã¦ããããããããç¨ã®Perlã¯ã©ã¤ã¢ã³ã(PerlBot)ã½ã¼ã¹ã®ä¸é¨ã§ãã
my $processo =("suid","/usr/sbin/sshd","rpc.idmapd","auditd","crond","klogd -x");
....(çç¥)....
$0="$processo"."\0"x16;;ãã®ããã«ãæªæã®ããã¹ã¯ãªããã"/usr/sbin/sshd"ã¨ãããããã¯crondãªã©ä¸è¬çãªãã¼ã¢ã³ã®ããã«è¦ãããããã¨ã§ãpsã³ãã³ãã§è¦ã¤ããã«ããããããã§ããpsã³ãã³ããæã£ã¦/usr/sbin/sshdãã²ã¨ã¤ç´ãè¾¼ãã§ãã¦ããç®ã§ããã¨è¦ãããããªãæ®éã¯æ°ãã¤ãã¾ããã
fork()ããã¨?
ãã¯ãç´°ãããã¦èª°ãèå³ãªãã¨æãã¾ããã$0ãæ¸ãæããç¶æ ã§fork()ããã¨ãåããã»ã¹ã¸ã$0æ¹å¤ã¯å¼ãç¶ããã¾ãã
#!/usr/bin/perl $0 = "notepad.exe"; fork(); sleep 100;
ããããã¨ãnotepad.exeã2ã¤è¦ãã¾ãã
[ozuma@cent6 ps]$ ps x PID TTY STAT TIME COMMAND 1597 ? S 0:00 sshd: ozuma@pts/0 1598 pts/0 Ss 0:00 -bash 1705 ? S 0:00 sshd: ozuma@pts/1 1706 pts/1 Ss 0:00 -bash 1981 pts/0 S+ 0:00 notepad.exe 1982 pts/0 S+ 0:00 notepad.exe 1983 pts/1 R+ 0:00 ps x [ozuma@cent6 ps]$
ã ããä½? ã£ã¦è¨ããã¦ãå°ãã¾ãã
OSã«ããéã
åé ã«è¿°ã¹ã¾ãããã$0ãããã£ãã¹ã¯ãªãããpsã³ãã³ãã§ã©ãè¦ãããã¯ãOSã«ãã£ã¦éãã¾ããPerlã®ããã¥ã¡ã³ãã«ã¯ã£ããæ¸ããã¦ããéããFreeBSDã§ã¯$0ãããã£ã¦ãå¾ãã«(perl x.x.x)ã¨ããæååãå¿ ãå ¥ãã¾ãããã®ããFreeBSDã§ã¯ãPerlã§æ¸ããããã«ã¦ã§ã¢ãpså½è£ ããã®ãé£ãããªãã¾ãã
[ozuma@freebsd9 ~]$ ps x PID TT STAT TIME COMMAND ....(çç¥).... 621 0 S+ 0:00.00 notepad.exe (perl5.16.3) 617 1 Ss 0:00.00 -bash (bash) 622 1 R+ 0:00.00 ps x [ozuma@freebsd9 ~]$
ã¡ãªã¿ã«Solarisã§ã¯(è¥ã人ã¯ç¥ããªãã¦ããOSã§ã)ã以ä¸ã®ããã«$0ãããã£ã¦psã³ãã³ãã§è¦ã¦ããä½ãå¤ãã£ã¦ãã¾ãããå
ã®ã³ãã³ãã©ã¤ã³ãã®ã¾ã¾ã表示ããã¾ãã

Solarisã®psã³ãã³ãã¯ãLinuxã¨ã¯éã£ã¦ã«ã¼ãã«å
ã®ããã»ã¹ãã¼ãã«ããç´æ¥æã£ã¦ãããããPerlã¹ã¯ãªããå
ã§ä½ãããããpsã®åºåã¯å¤ããã¾ãã(â¦â¦ã ã£ãã¯ã)ã
ä¸å¿æå¾ã«æè¨ããããã¨ãæ¸ãã¨ãä¾µå ¥ããã¦æªæã®ããããã»ã¹ãåãã¦ãããããããªããµã¼ãä¸ã§ããã»ã¹èª¿æ»ããã«ã¯ãLinuxã§ã¯psã³ãã³ãã«cãªãã·ã§ã³ãä»ããåºåãåå¾ãã¦ãããæ¹ãè¯ããã¨ãããã¨ã§ããã¾ãFreeBSDãSolarisãªãã$0å½è£ ãå¹ããªãã®ã§ãã®è¾ºã®å¤å¥ãããããããªãã¾ãã
ãã£ã¨ããããªã±ã¼ã¹ã§ã¯ãããããpsã³ãã³ãèªä½ãä¾µå ¥è ã«ç½®ãæãããã¦ãã¾ã£ã¦ããã®ã§ã¯â¦â¦ã¨ããã©ã¬ã³ã¸ãã¯çã«è²ã å¿é ããªãã¨ãããªããã¨ãããã®ã§ããã¾ãå®ç¨çã¨ã¯è¨ããªãç¥èã§ããã¾ãå°ãã¿ã§ããã
(追è¨) ãããã¦èªã¿ãã
@k_morihisaããããå®éã«ä»è¾¼ã¾ãããã«ãªã£ãIRCBOTã®ã½ã¼ã¹ã³ã¼ããå ã«ãå½è£ ããã»ã¹åã®ä¸è¦§ãä½ããã¦ãã¾ããè峿·±ãã