問(wèn)題描述
我正在使用 crontab 為我的 minecraft 服務(wù)器運(yùn)行維護(hù)腳本.大多數(shù)時(shí)候它工作正常,除非 crontab 嘗試使用重啟腳本.如果我手動(dòng)運(yùn)行重新啟動(dòng)腳本,則沒(méi)有任何問(wèn)題.因?yàn)槲蚁嘈潘c路徑名有關(guān),所以我試圖確保它總是從 minecraft 目錄執(zhí)行任何 minecraft 命令.所以我將命令封裝在 pushd/popd 中:
I'm using a crontab to run a maintenance script for my minecraft server. Most of the time it works fine, unless the crontab tries to use the restart script. If I run the restart script manually, there aren't any issues. Because I believe it's got to do with path names, I'm trying to make sure it's always doing any minecraft command FROM the minecraft directory. So I'm encasing the command in pushd/popd:
os.system("pushd /directory/path/here")
os.system("command to sent to minecraft")
os.system("popd")
下面是一個(gè)交互式會(huì)話,將我的世界從等式中剔除.一個(gè)簡(jiǎn)單的ls"測(cè)試.如您所見(jiàn),它根本沒(méi)有從 pushd 目錄運(yùn)行 os.system 命令,而是從/etc/運(yùn)行 python 來(lái)說(shuō)明我的觀點(diǎn)的目錄.顯然 pushd 不能通過(guò) python 工作,所以我想知道我還能如何實(shí)現(xiàn)這一目標(biāo).謝謝!
Below is an interactive session taking minecraft out of the equation. A simple "ls" test. As you can see, it does not at all run the os.system command from the pushd directory, but instead from /etc/ which is the directory in which I was running python to illustrate my point.Clearly pushd isn't working via python, so I'm wondering how else I can achieve this. Thanks!
>>> def test():
... import os
... os.system("pushd /home/[path_goes_here]/minecraft")
... os.system("ls")
... os.system("popd")
...
>>> test()
~/minecraft /etc
DIR_COLORS cron.weekly gcrypt inputrc localtime mime.types ntp ppp rc3.d sasldb2 smrsh vsftpd.ftpusers
DIR_COLORS.xterm crontab gpm-root.conf iproute2 login.defs mke2fs.conf ntp.conf printcap rc4.d screenrc snmp vsftpd.tpsave
X11 csh.cshrc group issue logrotate.conf modprobe.d odbc.ini profile rc5.d scsi_id.config squirrelmail vz
adjtime csh.login group- issue.net logrotate.d motd odbcinst.ini profile.d rc6.d securetty ssh warnquota.conf
aliases cyrus.conf host.conf java lvm mtab openldap protocols redhat-release security stunnel webalizer.conf
alsa dbus-1 hosts jvm lynx-site.cfg multipath.conf opt quotagrpadmins resolv.conf selinux sudoers wgetrc
alternatives default hosts.allow jvm-commmon lynx.cfg my.cnf pam.d quotatab rndc.key sensors.conf sysconfig xinetd.conf
bashrc depmod.d hosts.deny jwhois.conf mail named.caching-nameserver.conf passwd rc rpc services sysctl.conf xinetd.d
blkid dev.d httpd krb5.conf mail.rc named.conf passwd- rc.d rpm sestatus.conf termcap yum
cron.d environment imapd.conf ld.so.cache mailcap named.rfc1912.zones pear.conf rc.local rsyslog.conf setuptool.d udev yum.conf
cron.daily exports imapd.conf.tpsave ld.so.conf mailman netplug php.d rc.sysinit rwtab shadow updatedb.conf yum.repos.d
cron.deny filesystems init.d ld.so.conf.d makedev.d netplug.d php.ini rc0.d rwtab.d shadow- vimrc
cron.hourly fonts initlog.conf libaudit.conf man.config nscd.conf pki rc1.d samba shells virc
cron.monthly fstab inittab libuser.conf maven nsswitch.conf postfix rc2.d sasl2 skel vsftpd
sh: line 0: popd: directory stack empty
===(CentOS 服務(wù)器與 python 2.4)
=== (CentOS server with python 2.4)
推薦答案
每個(gè) shell 命令都在單獨(dú)的進(jìn)程中運(yùn)行.它生成一個(gè) shell,執(zhí)行 pushd 命令,然后 shell 退出.
Each shell command runs in a separate process. It spawns a shell, executes the pushd command, and then the shell exits.
只需在同一個(gè) shell 腳本中編寫(xiě)命令:
Just write the commands in the same shell script:
os.system("cd /directory/path/here; run the commands")
更好的(也許)方法是使用 subprocess
模塊:
A nicer (perhaps) way is with the subprocess
module:
from subprocess import Popen
Popen("run the commands", shell=True, cwd="/directory/path/here")
這篇關(guān)于通過(guò) os.system 推送的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!