Estoy usando un crontab para ejecutar un script de mantenimiento para mi servidor de Minecraft. La mayoría de las veces funciona bien, a menos que crontab intente utilizar el script de reinicio. Si ejecuto el script de reinicio manualmente, no hay ningún problema. Como creo que tiene que ver con los nombres de las rutas, estoy intentando asegurarme de que siempre está haciendo un comando de Minecraft DESDE el directorio de Minecraft. Así que estoy encierra el mando en pushd/popd:pushd through os.system
os.system("pushd /directory/path/here")
os.system("command to sent to minecraft")
os.system("popd")
A continuación se muestra una sesión interactiva teniendo Minecraft fuera de la ecuación. Una simple prueba "ls". Como puede ver, no ejecuta en absoluto el comando os.system desde el directorio pushd, sino desde/etc/que es el directorio en el que estaba ejecutando python para ilustrar mi punto. Claramente pushd no funciona a través de python , entonces me pregunto cómo más puedo lograr esto. ¡Gracias!
>>> 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
=== (servidor CentOS con el pitón 2.4)
estoy un poco confundido por la línea que va Para mí, parece un simple caso del hecho de que 'os.system' genera una subshell ... haciendo' bash -c "pushd directory" ',' bash -c "popd" 'le dará el mismo resultado. ¿Por qué no usar 'os.chdir'? – photoionized
nvm acerca de la línea de confusión, es la salida de su 'pushd' que se está ejecutando, pero el análisis sigue en pie, sus comandos no funcionan porque' os.system' genera una subshell. – photoionized
... y una vez que se completa la subshell, el contexto pushd/popd se vuelve sin sentido. – macetw